Android RecyclerView 의 페이지 새로 고침 실현

개발 과정 에서 자주 페이지 를 새로 고 치 는 데 사 용 됩 니 다.여기 서 RecyclerView 의 간단 한 페이지 새로 고 치 는 작업 을 실현 합 니 다.테스트 효 과 는 글 끝 에 있 고 실현 과정 은 다음 과 같 습 니 다.
사고의 방향 을 실현 하 다.
  • 더 많은 데 이 터 를 RecyclerView 에 불 러 와 여러 레이아웃 을 불 러 옵 니 다.View Type 에 따라 데 이 터 를 불 러 올 지 Footer Item 을 불 러 올 지 판단 합 니 다
  • 스 레 드 를 통 해 데 이 터 를 모 의 로드 합 니 다
  • RecyclerView 에 addOnScrollListener 이 벤트 를 추가 하여 사용자 의 미끄럼 동작 을 감청 합 니 다
  • 사용자 의 미끄럼 상태 와 구체 적 인 상황 에 따라 데 이 터 를 불 러 오기 시작 합 니 다
  • 데이터 업데이트 알림;
  • 어떻게 firstVisibleItemPosition 을 획득 합 니까
    데이터 로드 에서 데 이 터 를 언제 불 러 올 지 동적 으로 판단 하기 위해 서 는 화면 에 표 시 된 첫 번 째 보 이 는 Item 의 위 치 를 알 아야 합 니 다.물론 레이아웃 관리 자 는 LinearLayoutManager 를 사용 합 니 다.이렇게 하면 화면 에 첫 번 째 로 보 이 는 Item 을 찾기 가 쉬 워 집 니 다.다음은 LinearLayoutManager 의 네 가지 방법 을 소개 합 니 다.
    findFirstVisibleItemPosition()
    화면 에서 첫 번 째 로 보 이 는 아 이 템 의 position 을 가 져 옵 니 다.이 아 이 템 의 일부분 만 볼 수 있다 면 되 돌아 오 는 position 은 이 아 이 템 의 position 입 니 다.
    findFirstCompletelyVisibleItemPosition()
    화면 에 있 는 첫 번 째 완전 하 게 보 이 는 아 이 템 의 position 을 가 져 옵 니 다.이 아 이 템 의 일부분 이 보이 지 않 는 다 면 되 돌아 오 는 position 은 이 아 이 템 에 대응 하 는 다음 완전한 아 이 템 을 표시 할 수 있 는 position 입 니 다.
    findLastVisibleItemPosition()
    화면 에서 마지막 으로 보 이 는 아 이 템 의 position 를 가 져 옵 니 다.이 아 이 템 의 일부분 만 볼 수 있다 면 되 돌아 오 는 position 은 이 아 이 템 의 position 입 니 다.
    findLastCompletelyVisibleItemPosition()
    화면 에 마지막 으로 보 이 는 아 이 템 의 position 을 가 져 옵 니 다.이 아 이 템 의 일부분 이 보이 지 않 는 다 면 되 돌아 오 는 position 은 이 아 이 템 에 대응 하 는 이전 아 이 템 의 position 입 니 다.
    준비 데이터
    
    /**
      *      
      * @return
      */
     public void initData(){
      for (int i=0;i<30;i++){
       arrayList.add(" "+i+"   ");
      }
     }
     
     /**
      *         
      */
     class LoadDataThread extends Thread{
      @Override
      public void run() {
       initData();
       try {
        Thread.sleep(2000);
       } catch (InterruptedException e) {
        e.printStackTrace();
       }
       //         
       Message message = handler.obtainMessage();
       message.what = UPDATE_DATA;
       message.obj = arrayList;
       handler.sendMessage(message);
      }
     }
    
    코드 참조
    주 레이아웃
    
    <?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:layout_width="match_parent"
     android:layout_height="match_parent"
     tools:context="com.manu.mrecyclerview.MainActivity">
     <android.support.v7.widget.RecyclerView
      android:id="@+id/rv"
      android:layout_width="match_parent"
      android:layout_height="match_parent">
     </android.support.v7.widget.RecyclerView>
    </LinearLayout>
    
    항목 레이아웃
    
    /**item.xml**/
    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
     android:orientation="vertical"
     android:layout_width="match_parent"
     android:layout_height="match_parent"
     android:padding="5dp">
     <TextView
      android:id="@+id/tv_recycle"
      android:layout_width="match_parent"
      android:layout_height="wrap_content"
      android:gravity="center_horizontal"
      android:text="data"
      android:background="#cac3c3"
      android:padding="10dp"
      android:textSize="20sp"/>
    </LinearLayout>
    
    
    /**item_footer.xml**/
    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
     android:orientation="horizontal"
     android:layout_width="match_parent"
     android:layout_height="match_parent"
     android:gravity="center_horizontal">
     <ProgressBar
      style="?android:attr/progressBarStyleSmall"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:id="@+id/progressBar" />
     <TextView
      android:text="       ,   ..."
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:id="@+id/textView" />
    </LinearLayout>
    
    Adapter
    여 기 는 RecyclerView 가 서로 다른 ViewType 에 따라 다양한 레이아웃 을 불 러 오 는 용법 을 사 용 했 습 니 다.사용 시 레이아웃 에 따라 서로 다른 ViewHolder 를 만 든 다음 에 서로 다른 Viewholder 에 대응 하 는 Item 에 데 이 터 를 추가 합 니 다.getItemViewType()방법의 용법 에 주의 하 십시오.Adapter 코드 는 다음 과 같 습 니 다.
    
    /**
     * Created by jzman on 2017/6/04
     * RecycleView Adapter
     */
    public class RvAdapter1 extends RecyclerView.Adapter<RecyclerView.ViewHolder> implements
      View.OnClickListener{
     private static final int ITEM_FOOTER = 0x1;
     private static final int ITEM_DATA = 0x2;
     private Context mContext;
     private RecyclerView recyclerView;
     private ArrayList<String> mList;
    
     public RvAdapter1() {}
    
     public RvAdapter1(Context mContext, ArrayList<String> mList) {
      this.mContext = mContext;
      this.mList = mList;
     }
    
     public void setmList(ArrayList<String> mList) {
      this.mList = mList;
     }
    
     /**
      *     ViewHolder
      * @param parent
      * @param viewTypez
      * @return
      */
     @Override
     public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
      View view ;
      RecyclerView.ViewHolder vh = null;
      switch (viewType){
       case ITEM_DATA:
        view = LayoutInflater.from(mContext).inflate(R.layout.item,null);
        view.setOnClickListener(this);
        vh = new DataViewHolder(view);
        //        (xml       )
        view.setLayoutParams(new ViewGroup.LayoutParams(
          ViewGroup.LayoutParams.MATCH_PARENT,
          ViewGroup.LayoutParams.WRAP_CONTENT));
        break;
       case ITEM_FOOTER:
        view = LayoutInflater.from(mContext).inflate(R.layout.item_footer,null);
        //        (xml       )
        vh = new FooterViewHolder(view);
        view.setLayoutParams(new ViewGroup.LayoutParams(
          ViewGroup.LayoutParams.MATCH_PARENT,
          ViewGroup.LayoutParams.WRAP_CONTENT));
        break;
      }
      return vh;
     }
    
     /**
      *   Item View  
      * @param position
      * @return
      */
     @Override
     public int getItemViewType(int position) {
      //   Item   position       Viewtype
      if (position == (getItemCount())-1){
       return ITEM_FOOTER;
      }else{
       return ITEM_DATA;
      }
     }
    
     /**
      *     
      * @param holder
      * @param position
      */
     @Override
     public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
      if (holder instanceof DataViewHolder){
       DataViewHolder dataViewHolder = (DataViewHolder) holder;
       dataViewHolder.tv_data.setText(mList.get(position));
      }else if (holder instanceof FooterViewHolder){
    
      }
     }
    
     /**
      *     
      * @return
      */
     @Override
     public int getItemCount() {
      return mList.size()+1;
     }
    
     @Override
     public void onClick(View view) {
      //  RecyclerView    View   
      int position = recyclerView.getChildAdapterPosition(view);
      //      ,         onItemClick()  
      if (onItemClickListener!=null){
       onItemClickListener.onItemClick(recyclerView,view,position,mList.get(position));
      }
     }
    
     /**
      *   ViewHolder
      */
     public static class DataViewHolder extends RecyclerView.ViewHolder{
      TextView tv_data;
      public DataViewHolder(View itemView) {
       super(itemView);
       tv_data = (TextView) itemView.findViewById(R.id.tv_recycle);
      }
     }
    
     /**
      *   footer ViewHolder
      */
     public static class FooterViewHolder extends RecyclerView.ViewHolder{
      public FooterViewHolder(View itemView) {
       super(itemView);
      }
     }
    
     private OnItemClickListener onItemClickListener;
     public void setOnItemClickListener(OnItemClickListener onItemClickListener){
      this.onItemClickListener = onItemClickListener;
     }
    
     /**
      *   RecyclerView           
      */
     public interface OnItemClickListener{
      //  (   ,     View,   View   ,  )
      void onItemClick(RecyclerView parent,View view, int position, String data);
     }
     /**
      *  RecycleView   Adapter 
      */
     @Override
     public void onAttachedToRecyclerView(RecyclerView recyclerView) {
      super.onAttachedToRecyclerView(recyclerView);
      this.recyclerView= recyclerView;
     }
     /**
      *  RecycleView Adapter  
      */
     @Override
     public void onDetachedFromRecyclerView(RecyclerView recyclerView) {
      super.onDetachedFromRecyclerView(recyclerView);
      this.recyclerView = null;
     }
    }
    
    
    MainActivity
    여 기 는 rv.addOnScrollListener(new OnScrollListener()...의 구체 적 인 실현 에 주의 하 십시오.MainActivity 코드 는 다음 과 같 습 니 다.
    
    /**
     * Created by jzman on 2017/6/04 0013.
     */
    public class MainActivity extends AppCompatActivity {
     private static final int UPDATE_DATA = 0x3;
     
     private RecyclerView rv;
     RvAdapter1 adapter;
    
     private ArrayList<String> arrayList = new ArrayList<>();
     //              
     private int lastLoadDataItemPosition;
    
     @Override
     protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_main);
      rv = (RecyclerView) findViewById(R.id.rv);
    
      //       
      rv.setLayoutManager(new LinearLayoutManager(this));//  
    //  rv.setLayoutManager(new GridLayoutManager(this,4));//  
    //  rv.setLayoutManager(new StaggeredGridLayoutManager(4,StaggeredGridLayoutManager.VERTICAL));//  
      initData();
      adapter = new RvAdapter1(this,arrayList);
      adapter.setOnItemClickListener(new RvAdapter1.OnItemClickListener() {
       @Override
       public void onItemClick(RecyclerView parent, View view, int position, String data) {
        Toast.makeText(MainActivity.this, data, Toast.LENGTH_SHORT).show();
       }
      });
    
      rv.addOnScrollListener(new OnScrollListener() {
       @Override
       public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
        if (newState == SCROLL_STATE_IDLE &&
          lastLoadDataItemPosition == adapter.getItemCount()){
         new LoadDataThread().start();
        }
       }
    
       @Override
       public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
    
        LayoutManager layoutManager = recyclerView.getLayoutManager();
        if (layoutManager instanceof LinearLayoutManager){
         LinearLayoutManager manager = (LinearLayoutManager) layoutManager;
         int firstVisibleItem = manager.findFirstVisibleItemPosition();
         int l = manager.findLastCompletelyVisibleItemPosition();
         lastLoadDataItemPosition = firstVisibleItem+(l-firstVisibleItem)+1;
        }
       }
      });
    
      rv.setAdapter(adapter);
     }
    
     /**
      *      
      * @return
      */
     public void initData(){
      for (int i=0;i<25;i++){
       arrayList.add(" "+i+"   ");
      }
     }
    
     /**
      *         
      */
     class LoadDataThread extends Thread{
      @Override
      public void run() {
       initData();
       try {
        Thread.sleep(2000);
       } catch (InterruptedException e) {
        e.printStackTrace();
       }
       Message message = handler.obtainMessage();
       message.what = UPDATE_DATA;
       message.obj = arrayList;
       handler.sendMessage(message);
      }
     }
    
     private Handler handler = new Handler(){
    
      @Override
      public void handleMessage(Message msg) {
       super.handleMessage(msg);
       switch (msg.what){
        case UPDATE_DATA:
         arrayList = (ArrayList<String>) msg.obj;
         adapter.setmList(arrayList);
         adapter.notifyDataSetChanged();
         break;
       }
      }
     };
    }
    
    
    테스트 효과

    이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

    좋은 웹페이지 즐겨찾기