Android 의 RecyclerView 는 드 롭 다운 리 셋 과 더 많은 예제 불 러 오기 를 쉽게 실현 합 니 다.

11886 단어 recyclerviewandroid
오늘 은 RecyclerView 의 미끄럼 사건 을 연 구 했 습 니 다.특히 드 롭 다운 리 셋 과 더 많은 사건 을 불 러 왔 습 니 다.현재 거의 모든 앱 이 데이터 목록 을 표시 할 때 사 용 됩 니 다.사용자 정의 RecyclerView 드 롭 다운 리 셋 과 로드 는 복잡 하 게 들 리 지만 미끄럼 사건 에 대한 감청 과 처리 만 있 으 면 어렵 지 않 습 니 다.
1.사용자 정의 RecyclerView 는 드 롭 다운 리 셋 과 더 많은 로드 를 실현 합 니 다.
1.RecyclerView 가 위 에서 미 끄 러 지 는 지 내 려 가 는 지 어떻게 판단 합 니까?
RecyclerView 의 OnScroll Listener 미끄럼 사건 감청 에서 좋 은 방법 은 바로 onScrolled(RecyclerView recyclerView,int dx,int dy)이다.그 중에서 dx 의 값 의 양음 에 따라 왼쪽 에서 미 끄 러 지 는 지 오른쪽 에서 미 끄 러 지 는 지 판단 할 수 있 고 dy 의 값 에 따라 위 에서 미 끄 러 지 는 지 내 려 가 는 지 판단 할 수 있다.

//  
if(dy>0){
//      
}
//  
else if(dy<0){
//      
}
2.꼭대기 나 바닥 까지 미 끄 러 졌 는 지 판단 하 는 방법
마찬가지 로 RecyclerView 의 OnScroll Listener 미끄럼 사건 감청 에서 onScrolled(RecyclerView recyclerView,int dx,int dy)방법 에서 처리 하고 canScroll Vertically(int direction)에 따라 판단 합 니 다.

//      
if(!recyclerView.canScrollVertically(1)){
 //      
}
//      
if(!recyclerView.canScrollVertically(-1)){
 //      
}
3.사용자 정의 RecyclerView
미끄럼 사건 의 판단 과 처 리 를 알 게 되면 드 롭 다운 리 셋 과 로드 를 쉽게 실현 할 수 있 습 니 다.

import android.content.Context;
import android.support.annotation.Nullable;
import android.support.v7.widget.RecyclerView;
import android.util.AttributeSet;
import android.util.Log;

/**
 * Package:com.liuting.library
 * author:liuting
 * Date:2017/2/14
 * Desc:   RecycleView,            
 */

public class RefreshLoadMoreRecycleView extends RecyclerView {
 private Boolean isLoadMore;//          
 private Boolean isLoadEnd;//        
 private Boolean isLoadStart;//     
 private Boolean isRefresh;//          
 private int lastVisibleItem;//    
 private IOnScrollListener listener;//    

 public RefreshLoadMoreRecycleView(Context context) {
  super(context);
  init(context);
 }

 public RefreshLoadMoreRecycleView(Context context, @Nullable AttributeSet attrs) {
  super(context, attrs);
  init(context);
 }

 public RefreshLoadMoreRecycleView(Context context, @Nullable AttributeSet attrs, int defStyle) {
  super(context, attrs, defStyle);
  init(context);
 }

 public void init(Context context) {
  isLoadEnd=false;
  isLoadStart =true;

  this.addOnScrollListener(new RecyclerView.OnScrollListener() {
   @Override
   public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
    super.onScrollStateChanged(recyclerView, newState);
    //SCROLL_STATE_DRAGGING   SCROLL_STATE_IDLE          
    if (newState == RecyclerView.SCROLL_STATE_IDLE) {
     if (isLoadEnd) {
      //            
      if (isLoadMore) {//        ,    ,    isLoadEnd  false,        
       if (getListener() != null) {
        getListener().onLoadMore();
       }
      } else {//         
       if(getListener()!=null){
        getListener().onLoaded();
       }
      }
      isLoadEnd = false;
     } else if (isLoadStart) {
      if(isRefresh){
       if (getListener() != null) {
        getListener().onRefresh();
       }
       isLoadStart=false;
      }
     }

    }
   }

   @Override
   public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
    super.onScrolled(recyclerView, dx, dy);
    //  
    if(dy>0){
     //      
     if(!recyclerView.canScrollVertically(1)){
      isLoadEnd = true;
     }else{
      isLoadEnd = false;
     }
    }
    //  
    else if(dy<0){
     //      
     if(!recyclerView.canScrollVertically(-1)){
      isLoadStart=true;
     }else{
      isLoadStart=false;
     }
    }
   }
  });
 }

 //    
 public interface IOnScrollListener {
  void onRefresh();

  void onLoadMore();

  void onLoaded();
 }

 public IOnScrollListener getListener() {
  return listener;
 }

 public void setListener(IOnScrollListener listener) {
  this.listener = listener;
 }

 public Boolean getLoadMore() {
  return isLoadMore;
 }

 //          
 public void setLoadMoreEnable(Boolean loadMore) {
  isLoadMore = loadMore;
 }

 public Boolean getRefresh() {
  return isRefresh;
 }

 //          
 public void setRefreshEnable(Boolean refresh) {
  isRefresh = refresh;
 }
}

2.실제 사례
RecyclerView 가 정의 되 었 습 니 다.다음은 Demo 에서 실제 사용 하고 처리 합 니 다.
1.레이아웃 정의
레이아웃 파일 은 매우 간단 합 니 다.바로 RecyclerView 입 니 다.

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
 xmlns:android="http://schemas.android.com/apk/res/android"
 xmlns:tools="http://schemas.android.com/tools"
 android:id="@+id/activity_main"
 android:layout_width="match_parent"
 android:layout_height="match_parent"
 android:orientation="vertical"
 tools:context="com.liuting.refreshloadmorelistview.MainActivity">

 <com.liuting.library.RefreshLoadMoreRecycleView
  android:id="@+id/main_recycle_view_data"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:scrollbars="none"
   />
</LinearLayout>

2.RecyclerView 를 정의 합 니 다.어댑터
RecyclerView.Adapter 는 여기 서 간단하게 처리 합 니 다.목록 레이아웃 은 Android 자체 가 져 온 것 을 직접 사용 합 니 다.

import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

import java.util.List;

/**
 * Package:com.liuting.refreshloadmorelistview.adapter
 * author:liuting
 * Date:2017/2/16
 * Desc:  Adapter
 */

public class RefreshLoadMoreRecycleAdapter extends RecyclerView.Adapter<RefreshLoadMoreRecycleAdapter.ViewHolder> {
 private List<String> list;
 private Context context;

 public RefreshLoadMoreRecycleAdapter(Context context,List<String> list) {
  this.context =context;
  this.list = list;
 }

 @Override
 public RefreshLoadMoreRecycleAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
  View view = LayoutInflater.from(parent.getContext()).inflate(android.R.layout.simple_expandable_list_item_1, parent, false);
  RefreshLoadMoreRecycleAdapter.ViewHolder viewHolder = new RefreshLoadMoreRecycleAdapter.ViewHolder(view);
  return viewHolder;
 }

 @Override
 public void onBindViewHolder(ViewHolder holder, int position) {
  holder.text.setText(list.get(position));
  holder.itemView.setTag(position);
 }

 @Override
 public int getItemCount() {
  return list.size();
 }

 class ViewHolder extends RecyclerView.ViewHolder{
  private TextView text;

  public ViewHolder(View itemView) {
   super(itemView);
   text=(TextView)itemView.findViewById(android.R.id.text1);
  }
 }
}

3.Activity 에서 컨트롤 과 데이터 로드 작업 을 정의 합 니 다.
사용자 정의 RecyclerView 의 데이터 로 딩 이벤트 감청,새로 고침,로 딩,로 딩 이 완료 되 었 습 니 다.

import android.app.ProgressDialog;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.LinearLayoutManager;
import android.widget.Toast;

import com.liuting.library.RefreshLoadMoreRecycleView;
import com.liuting.refreshloadmorelistview.adapter.RefreshLoadMoreRecycleAdapter;

import java.util.ArrayList;
import java.util.List;

public class MainActivity extends AppCompatActivity implements RefreshLoadMoreRecycleView.IOnScrollListener{
 private RefreshLoadMoreRecycleView recycleView;//    RecycleView
 private List<String> list;//  
 private RefreshLoadMoreRecycleAdapter adapter;//Adapter
 private ProgressDialog dialog;//   
 private static final int REFRESH_Load=0;//    
 private static final int MORE_Load=1;//    
 private Handler handler =new Handler(){
  @Override
  public void handleMessage(Message msg) {
   super.handleMessage(msg);
   switch (msg.what){
    case REFRESH_Load:
     recycleView.setLoadMoreEnable(true);
     dismissDialog();
     if(list!=null){
      list.clear();
     }
     loadData();
     adapter.notifyDataSetChanged();
     break;
    case MORE_Load:
     recycleView.setLoadMoreEnable(false);
     dismissDialog();
     loadData();
     adapter.notifyDataSetChanged();
     break;
   }
  }
 };

 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);
  initView();
 }

 public void initView(){
  dialog = new ProgressDialog(MainActivity.this);

  list=new ArrayList<>();
  loadData();
  recycleView = (RefreshLoadMoreRecycleView)findViewById(R.id.main_recycle_view_data);

  final LinearLayoutManager linearLayoutManager = new LinearLayoutManager(MainActivity.this);
  recycleView.setLayoutManager(linearLayoutManager);
  adapter = new RefreshLoadMoreRecycleAdapter(MainActivity.this,list);
  recycleView.setAdapter(adapter);
  recycleView.setListener(this);
  recycleView.setRefreshEnable(true);
  recycleView.setLoadMoreEnable(true);
 }

 /**
  *     
  */
 public void loadData(){
  for(int i=0;i<10;i++ ){
   list.add("It is "+i);
  }
 }

 @Override
 public void onRefresh() {
  showDialog();
  new Thread(){
   @Override
   public void run() {
    super.run();
    try {
     sleep(5000);
     handler.sendEmptyMessage(REFRESH_Load);
    } catch (InterruptedException e) {
     e.printStackTrace();
    }
   }
  }.start();
 }

 @Override
 public void onLoadMore() {
  showDialog();
  new Thread(){
   @Override
   public void run() {
    super.run();
    try {
     sleep(5000);
     handler.sendEmptyMessage(MORE_Load);
    } catch (InterruptedException e) {
     e.printStackTrace();
    }
   }
  }.start();
 }

 @Override
 public void onLoaded() {
  Toast.makeText(MainActivity.this,"Loaded all",Toast.LENGTH_SHORT).show();
 }

 /**
  * dismiss dialog
  */
 private void dismissDialog(){
  if (dialog!=null&&dialog.isShowing()){
   dialog.dismiss();
  }
 }

 /**
  * show dialog
  */
 private void showDialog(){
  if (dialog!=null&&!dialog.isShowing()){
   dialog.show();
  }
 }
}
3.최종 효과 도

여기까지 RecyclerView 의 드 롭 다운 리 셋 과 로 딩 을 쉽게 실현 할 수 있 습 니 다.
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기