栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 移动开发 > Android

Android RecyclerView的刷新分页的实现

Android 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Android RecyclerView的刷新分页的实现

在开发中常常使用到刷新分页,这里实现一个 RecyclerView 的简单的刷新分页操作,测试效果见文末,实现过程参考如下:

实现思路

  1. 加载更多数据使用到 RecyclerView 加载多种布局,根据 ViewType 判断加载数据 Item 还是加载 FooterItem ;
  2. 通过线程模拟加载数据;
  3. 为 RecyclerView 添加 addonScrollListener 事件来监听用户的滑动操作;
  4. 根据用户滑动状态以及具体情况开始加载数据
  5. 通知数据更新;

如何获得 firstVisibleItemPosition

为了能够在数据加载中动态判断什么时候加载数据,需要知道屏幕上显示的第一个可见的 Item 的位置,当然了这里使用的是布局管理器是 LinearLayoutManager ,这样查找屏幕上第一个可见的 Item 就显得容易多了,下面介绍一些 LinearLayoutManager 的四个方法:

findFirstVisibleItemPosition()

获得屏幕上第一个可见 Item 的 position,只要该 Item 有一部分可见,那么返回的 position 就是该Item 的 position。

findFirstCompletelyVisibleItemPosition()

获得屏幕上第一个完整可见的 Item 的 position,只要该 Item 有一部分不可见,那么返回的 position 就是该 Item 对应的下一个能显示完整的 Item 的position。

findLastVisibleItemPosition()

获得屏幕上最后一个可见 Item 的 position,只要该 Item 有一部分可见,那么返回的 position 就是该Item 的 position。

findLastCompletelyVisibleItemPosition()

获得屏幕上最后一个完整可见的 Item 的 position,只要该 Item 有一部分不可见,那么返回的 position 就是该 Item 对应的上一个能显示完整的 Item 的position。

准备数据


 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);
  }
 }

代码参考

主布局



 
 

Item布局




 




 
 

Adapter

这里使用了 RecyclerView 根据不同的 ViewType 加载多种布局的用法,使用时根据不同的布局创建不同的 ViewHolder , 然后根据不同的 Viewholder 为对应的 Item 添加数据,注意 getItemViewType() 方法的用法,Adapter 代码参考如下:


public class RvAdapter1 extends RecyclerView.Adapter 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 mList;

 public RvAdapter1() {}

 public RvAdapter1(Context mContext, ArrayList mList) {
  this.mContext = mContext;
  this.mList = mList;
 }

 public void setmList(ArrayList mList) {
  this.mList = mList;
 }

 
 @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;
 }

 
 @Override
 public int getItemViewType(int position) {
  //根据 Item 的 position 返回不同的 Viewtype
  if (position == (getItemCount())-1){
   return ITEM_FOOTER;
  }else{
   return ITEM_DATA;
  }
 }

 
 @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){

  }
 }

 
 @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));
  }
 }

 
 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);
  }
 }

 
 public static class FooterViewHolder extends RecyclerView.ViewHolder{
  public FooterViewHolder(View itemView) {
   super(itemView);
  }
 }

 private onItemClickListener onItemClickListener;
 public void setonItemClickListener(onItemClickListener onItemClickListener){
  this.onItemClickListener = onItemClickListener;
 }

 
 public interface OnItemClickListener{
  //参数(父组件,当前单击的View,单击的View的位置,数据)
  void onItemClick(RecyclerView parent,View view, int position, String data);
 }
 
 @Override
 public void onAttachedToRecyclerView(RecyclerView recyclerView) {
  super.onAttachedToRecyclerView(recyclerView);
  this.recyclerView= recyclerView;
 }
 
 @Override
 public void onDetachedFromRecyclerView(RecyclerView recyclerView) {
  super.onDetachedFromRecyclerView(recyclerView);
  this.recyclerView = null;
 }
}

MainActivity

这里主要注意 rv.addonScrollListener(new onScrollListener() ...里面的具体实现,MainActivity 代码参考如下:


public class MainActivity extends AppCompatActivity {
 private static final int UPDATE_DATA = 0x3;
 
 private RecyclerView rv;
 RvAdapter1 adapter;

 private ArrayList 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);
 }

 
 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) msg.obj;
     adapter.setmList(arrayList);
     adapter.notifyDataSetChanged();
     break;
   }
  }
 };
}

测试效果

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持考高分网。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/156154.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号