Android 드롭다운 플러시 및 업로드 데이터(네트워크 요청 데이터)
17131 단어 네트워크 통신드롭다운 새로 고침
안드로이드 개발에서 우리는 상단 로드와 하단 리셋 기능을 자주 만나게 된다. 인터넷을 통해 데이터를 요청하고 컨트롤에 추가한다. 이전에 자신도 인터넷에서 글을 검색한 적이 있지만 기본적으로 쓸모가 크지 않다. 효과가 다르거나 붙인 코드가 완전하지 않아서 기능을 정상적으로 사용할 수 없다(매우 아프다).그래서 한참을 더듬은 후에 대체적으로 OK된 데모를 완성하여 여러분에게 참고하도록 했습니다.문제가 있으면 여러분의 지적을 바랍니다. 감격해 마지 않습니다.
낡은 관습에 먼저 효과도를 붙이다
사용된 컨트롤 및 도구 소개:
4
기왕 네트워크를 사용한 이상 네트워크 권한을 넣어야 한다
레이아웃 XML:
주: 이 SmartRefresh Layout은 사용자 정의 프레임워크입니다. GitHub에서 유래한gradle에 추가하면 됩니다.
MainActivity.class
/**
* activity
*/
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
/** activity */
Activity activity = this;
/** key */
public static String Joke_APPKEY = "e9bbc8a5de090451bd5da96dc574a94a";
/** URL */
public static final String HTTPURLS = "http://v.juhe.cn/joke/randJoke.php?";
/** */
private static Animation rotateAnimation;
/** */
static final int SUCC_CODE = 0;
/** */
ImageView joke_img_back, joke_img_load;
/** RV */
RecyclerView joke_rv;
/** */
JokeLVAdapter adapter;
/** , false */
boolean isRef, isLoad = false;
/** swf: */
RefreshLayout activity_joke_refreshLayout;
/** handler handleMessage */
Handler handler = new Handler(){
@Override
public void handleMessage(Message msg) {
// , adapter
if(msg.arg1 == SUCC_CODE && isLoad || isRef){
adapter.notifyDataSetChanged();
}
// , , RV
else if(msg.arg1 == SUCC_CODE){
joke_img_load.clearAnimation();
joke_img_load.setVisibility(View.GONE);
adapter = new JokeLVAdapter(activity, datas);
joke_rv.setLayoutManager(new LinearLayoutManager(activity));
joke_rv.setAdapter(adapter);
// rv item , openWindow
adapter.setLinster(new JokeLVAdapter.ItemOnClickLinster() {
@Override
public void textItemOnClick(View view, int position) {
Log.i("activity", "----->position=" + position);
//
openWindow(position);
}
});
}else{
// , ,
joke_img_load.clearAnimation();
joke_img_load.setVisibility(View.GONE);
Toast.makeText(activity, R.string.getDataError, Toast.LENGTH_SHORT).show();
}
}
};
/**
* position
* @param position
*/
private void openWindow(int position) {
Toast.makeText(activity, " item " + position, Toast.LENGTH_SHORT).show();
}
/** , */
List datas = new ArrayList<>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.activity_main);
initView();
initData();
//
StatusBarCompat.setStatusBarColor(activity, ContextCompat.getColor(activity, R.color.cyan));
}
public void initView() {
// id
joke_img_back = findViewById(R.id.joke_img_back);
joke_img_load = findViewById(R.id.joke_img_load);
joke_rv = findViewById(R.id.joke_rv);
activity_joke_refreshLayout = findViewById(R.id.activity_joke_refreshLayout);
// refreshLayout
//
activity_joke_refreshLayout.setEnableOverScrollBounce(false);
//
activity_joke_refreshLayout.setDisableContentWhenRefresh(true);
activity_joke_refreshLayout.setDisableContentWhenLoading(true);
// ( true)
activity_joke_refreshLayout.setEnableAutoLoadmore(false);
/**
*
*/
activity_joke_refreshLayout.setOnRefreshListener(new OnRefreshListener() {
@Override
public void onRefresh(RefreshLayout refreshlayout) {
Log.i("activity", " ");
//
isRef = true;
handler.post(getRefreshDatas);
}
});
/**
*
*/
activity_joke_refreshLayout.setOnLoadmoreListener(new OnLoadmoreListener() {
@Override
public void onLoadmore(RefreshLayout refreshlayout) {
Log.i("activity", " ");
isLoad = true;
handler.post(getLoadmoreDatas);
}
});
//
joke_img_back.setOnClickListener(this);
}
public void initData() {
// xml ,
joke_img_load.setVisibility(View.VISIBLE);
openA(activity, joke_img_load);
//
handler.post(getDatas);
}
/**
* getDatas
*/
Runnable getDatas = new Runnable() {
@Override
public void run() {
HttpRequest.get(HTTPURLS + "&key=" + Joke_APPKEY, new Callback() {
@Override
public void onFailure(Call call, IOException e) {
e.printStackTrace();
}
@Override
public void onResponse(Call call, Response response) throws IOException {
Log.i("activity", " ");
String result = response.body().string();
JsonDta(result);
}
});
}
};
/**
* json
* @param result
*/
private void JsonDta(String result) {
Message message = handler.obtainMessage();
// json SJJokeNow
SJJokeNow obj = new Gson().fromJson(result, SJJokeNow.class);
// , handler
if(obj.getError_code() != 0){
message.arg1 = obj.getError_code();
handler.sendMessage(message);
}else {
// ,
if(isRef){
Log.i("activity", "------>" + obj.getReason());
List json = new ArrayList<>();
for (int i = 0; i < obj.getResult().size(); i ++){
JokesNew info = new JokesNew();
info.setHashId(obj.getResult().get(i).getHashId());
info.setContent(obj.getResult().get(i).getContent());
info.setUnixtime(obj.getResult().get(i).getUnixtime());
json.add(info);
}
for(int i = 0 ; i < datas.size() ; i++) {
json.add(datas.get(i));
}
datas.clear();
for(int i = 0 ; i < json.size() ; i++) {
datas.add(json.get(i));
}
isRef = false;
}else {
Log.i("activity", "------>" + obj.getReason());
for (int i = 0; i < obj.getResult().size(); i ++){
JokesNew info = new JokesNew();
info.setHashId(obj.getResult().get(i).getHashId());
info.setContent(obj.getResult().get(i).getContent());
info.setUnixtime(obj.getResult().get(i).getUnixtime());
datas.add(info);
}
}
message.arg1 = obj.getError_code();
handler.sendMessage(message);
}
}
/**
*
*/
Runnable getRefreshDatas = new Runnable() {
@Override
public void run() {
HttpRequest.get(HTTPURLS + "&key=" + Joke_APPKEY, new Callback() {
@Override
public void onFailure(Call call, IOException e) {
activity_joke_refreshLayout.finishRefresh(0000 , false);
e.printStackTrace();
}
@Override
public void onResponse(Call call, Response response) throws IOException {
Log.i("activity", " ");
activity_joke_refreshLayout.finishRefresh(0000 , true);
String result = response.body().string();
JsonDta(result);
}
});
}
};
/**
*
*/
Runnable getLoadmoreDatas = new Runnable() {
@Override
public void run() {
HttpRequest.get(HTTPURLS + "&key=" + Joke_APPKEY, new Callback() {
@Override
public void onFailure(Call call, IOException e) {
e.printStackTrace();
activity_joke_refreshLayout.finishLoadmore(0000 , false);
}
@Override
public void onResponse(Call call, Response response) throws IOException {
Log.i("activity", " ");
activity_joke_refreshLayout.finishLoadmore(0000 , true);
String result = response.body().string();
JsonDta(result);
}
});
}
};
@Override
public void onClick(View v) {
int temdId = v.getId();
if(temdId == R.id.joke_img_back){
finish();
}
}
/**
*
* @param img
*/
public static void openA(Activity activity, ImageView img){
// loading
rotateAnimation = AnimationUtils.loadAnimation(activity, R.anim.loading);
LinearInterpolator interpolator = new LinearInterpolator();
rotateAnimation.setInterpolator(interpolator);
img.startAnimation(rotateAnimation);
}
}
주: 본문의 주석은 이미 상당히 명확하게 썼기 때문에 설명을 많이 하지 않겠습니다.
JokeLVAdapter.class
/**
*
*/
public class JokeLVAdapter extends RecyclerView.Adapter {
/** */
Activity context;
/** */
List data;
/** */
LayoutInflater inflater;
/**
* , , 。
*/
LruCache mMemoryCache;
/**
* data activity
* @param activity
* @param datas
*/
public JokeLVAdapter(Activity activity, List datas){
this.context = activity;
this.data = datas;
//
inflater = LayoutInflater.from(activity);
//
int maxMemory = (int) Runtime.getRuntime().maxMemory();
int cacheSize = maxMemory / 8;
mMemoryCache = new LruCache(cacheSize) {
@Override
protected int sizeOf(String key, BitmapDrawable drawable) {
return drawable.getBitmap().getByteCount();
}
};
}
/**
* , activity onCreate
* @param parent
* @param viewType
* @return
*/
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.joke_lv_item, parent, false);
return new ViewHolder(view);
}
/**
*
* @param viewHolder
* @param position
*/
@Override
public void onBindViewHolder(final ViewHolder viewHolder, int position) {
viewHolder.joke_lv_txtconent.setText(data.get(position).getContent());
viewHolder.joke_lv_txttime.setText(" :" + data.get(position).getUnixtime() + "");
// tag
viewHolder.itemView.setTag(position);
}
/**
*
* @return
*/
@Override
public int getItemCount() {
return data.size();
}
/**
* // ViewHolder, Item
*/
public class ViewHolder extends RecyclerView.ViewHolder {
/** item */
public TextView joke_lv_txttime;
public TextView joke_lv_txtconent;
public LinearLayout lin_alljoke;
public ViewHolder(View rootView) {
super(rootView);
this.joke_lv_txtconent = rootView.findViewById(R.id.joke_lv_txtconent);
this.joke_lv_txttime = rootView.findViewById(R.id.joke_lv_txttime);
this.lin_alljoke = rootView.findViewById(R.id.lin_alljoke);
// item
this.lin_alljoke.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Linster.textItemOnClick(v, getPosition());
}
});
}
}
public ItemOnClickLinster Linster;
public void setLinster(ItemOnClickLinster linster) {
Linster = linster;
}
public interface ItemOnClickLinster{
void textItemOnClick(View view, int position);
}
}
주: 동상, 주석이 간단명료하고 쓸데없는 말이 많지 않습니다.계속, 다음:
다음 단계는 없을 것 같은데, 사실은 전체 기능에 이해하기 어려운 부분이 없다. 코드를 이해하고 자신의 프로젝트에서 숙련되게 사용하면 된다. 수요에 따라 서로 다른 실현 방식을 맞춤형으로 만들 수 있다. 이곳의 이런 방식은 단지 하나의 참고일 뿐이다. 그리고 어떤 좋은 방법이 있으면 나에게 추천할 수 있다.코드의 부족도 지적할 수 있습니다. 여러분의 좋은 소식을 기다리겠습니다!!
데모 원본을 첨부합니다. GitHub에 익숙하지 않기 때문에, 이곳의 링크는 csdn입니다.
여기 누르면 원본 다운로드, 빨리, 찔러, 찔러...
본고는 GitHub의 리셋 프레임워크를 인용하여 해석권을 가지지 않습니다. 리셋 프레임워크에 대해 더 알고 싶으면 아래 주소로 가서 읽으십시오.https://github.com/scwang90/SmartRefreshLayout
q:486789970 email:[email protected]
만약 무슨 문제가 있으면 여러분의 지도를 환영합니다.서로 연결되어 문장을 통해 서로 배울 수 있기를 바랍니다.
---
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
TCP 및 UDP 편집 프로세스 및 코드socket - 클라이언트 연결을 감청하는 데 사용할 소켓을 만듭니다 bind - 감청 소켓을 서버 IP 주소 및 포트 번호와 연결합니다 listen - 감청 시작 accept - 클라이언트 연결을 가져오고 클라이언...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.