Android RecyclerView上拉加载更多功能回d实现代码

Android RecyclerView上拉加载更多功能回d实现代码,第1张

概述实现原理是使用RecyclerView的OnTouchListener方法监听滑动在adapter里面增加两项footview其中date.size为显示的加载条,可以自定义,date.size+1为空白的View,我们设置其高度为0我们通过LinearLayoutManager的find

实现原理是使用RecyclerVIEw的OntouchListener方法监听滑动 在adapter里面增加两项footvIEw 其中date.size为显示的加载条,可以自定义,date.size+1为空白的VIEw,我们设置其高度为0 我们通过linearlayoutmanager的 findLastVisibleItemposition判断显示的最后一条数据,如果是空白vIEw,表示加载条已经完全展示,松开即可刷新。

回d效果是通过在滑动时动态改变空白vIEw的高度,达到阻尼效果 ,回d时再动态将其改为0,达到回d效果,通过loading防止加载过程中滑动导致显示问题 这里的回调采用了Runnable传参

public class RefreshFootAdapter extends     RecyclerVIEw.Adapter<RecyclerVIEw.VIEwHolder> {   // 上拉加载更多   public static final int SATUS_PulLUP_LOAD_MORE = 0;   // 正在加载中   public static final int SATUS_LOADING_MORE = 1;   public static final int SATUS_UP_LOADING_MORE = 2;   // 上拉加载更多状态-默认为0   private int load_more_status = 0;   private LayoutInflater mInflater;   private List<String> mTitles = null;   private static final int TYPE_ITEM = 0; // 普通Item VIEw   private static final int TYPE_FOOTER = 1; // 底部FootVIEw   private static final int TYPE_FOOTER_EMPTY = 2; // 底部空白VIEw   private static int pagesize;   private int evIEw_height = 1;   private long TimeFlag;// 回d时间   private RecyclerVIEw parent;   private boolean loadmare;// 判断当前是可加载更多   private boolean loading;// 判断是否正在加载   private int startY,NowY;// 滑动判断 <span > </span>//构造函数 处理滑动监听 更新等功能   public RefreshFootAdapter(Context context,RecyclerVIEw parent,final linearlayoutmanager linearlayoutmanager,int pagesize,final Runnable onloadmore) {     this.parent = parent;     this.mInflater = LayoutInflater.from(context);     this.mTitles = new ArrayList<String>();     for (int i = 0; i < 20; i++) {       int index = i + 1;       mTitles.add("item" + index);     }     this.pagesize = pagesize;     parent.setontouchListener(new OntouchListener() {       @OverrIDe       public boolean ontouch(VIEw v,MotionEvent ev) {         // Todo auto-generated method stub         switch (ev.getAction()) {         case MotionEvent.ACTION_MOVE:           NowY = (int) ev.getY();           if (RefreshFootAdapter.this.getItemCount() == linearlayoutmanager               .findLastVisibleItemposition() + 1) {             if (startY == 0) {// 按下               startY = NowY;             }             int changeY = NowY - startY;             RefreshFootAdapter.this                 .notifyEmptyVIEw((int) (-changeY / 1.3f));             if (loading) {               return false;             }             RefreshFootAdapter.this                 .changeMoreStatus(RefreshFootAdapter.this.SATUS_UP_LOADING_MORE);             loadmare = true;           } else {             loadmare = false;             if (loading) {               return false;             }             RefreshFootAdapter.this                 .changeMoreStatus(RefreshFootAdapter.this.SATUS_PulLUP_LOAD_MORE);             // 普通的滑动             startY = 0;           }           break;         case MotionEvent.ACTION_UP:           RefreshFootAdapter.this.resetEmptyVIEw();           if (loadmare) {             if (loading) {               return false;             } else {               RefreshFootAdapter.this                   .changeMoreStatus(RefreshFootAdapter.this.SATUS_LOADING_MORE);               if (onloadmore != null && !loading) {                 loading = true;                 onloadmore.run();               }             }           }           startY = 0;           break;         default:           break;         }         return false;       }     });   }   /**    * item显示类型    *    * @param parent    * @param vIEwType    * @return    */   public RecyclerVIEw.VIEwHolder onCreateVIEwHolder(VIEwGroup parent,int vIEwType) {     // 进行判断显示类型,来创建返回不同的VIEw     if (vIEwType == TYPE_ITEM) {       VIEw vIEw = mInflater.inflate(R.layout.item_recycler_layout,parent,false);       // 这边可以做一些属性设置,甚至事件监听绑定       // vIEw.setBackgroundcolor(color.RED);       ItemVIEwHolder itemVIEwHolder = new ItemVIEwHolder(vIEw);       return itemVIEwHolder;     } else if (vIEwType == TYPE_FOOTER) {       VIEw foot_vIEw = mInflater.inflate(           R.layout.recycler_load_more_layout,false);       // 这边可以做一些属性设置,甚至事件监听绑定       // vIEw.setBackgroundcolor(color.RED);       FootVIEwHolder footVIEwHolder = new FootVIEwHolder(foot_vIEw);       return footVIEwHolder;     } else if (vIEwType == TYPE_FOOTER_EMPTY) {       VIEw foot_vIEw_empty = mInflater.inflate(           R.layout.recycler_load_more_layout_empty,false);       // 这边可以做一些属性设置,甚至事件监听绑定       // vIEw.setBackgroundcolor(color.RED);       FootEmptyHolder footEmptyVIEwHolder = new FootEmptyHolder(           foot_vIEw_empty);       return footEmptyVIEwHolder;     }     return null;   }   /**    * 数据的绑定显示    *    * @param holder    * @param position    */   public voID onBindVIEwHolder(RecyclerVIEw.VIEwHolder holder,int position) {     if (holder instanceof ItemVIEwHolder) {       ((ItemVIEwHolder) holder).item_tv.setText(mTitles.get(position));       holder.itemVIEw.setTag(position);     } else if (holder instanceof FootVIEwHolder) {       FootVIEwHolder footVIEwHolder = (FootVIEwHolder) holder;       switch (load_more_status) {       case SATUS_PulLUP_LOAD_MORE:         footVIEwHolder.foot_vIEw_item_tv.setText("上拉加载更多...");         break;       case SATUS_LOADING_MORE:         footVIEwHolder.foot_vIEw_item_tv.setText("正在加载更多数据...");         break;       case SATUS_UP_LOADING_MORE:         footVIEwHolder.foot_vIEw_item_tv.setText("松开加载更多数据...");         break;       }     } else if (holder instanceof FootEmptyHolder) {       FootEmptyHolder footVIEwHolder = (FootEmptyHolder) holder;       footVIEwHolder.empty.setLayoutParams(new VIEwGroup.LayoutParams(           111,evIEw_height));     }   }   /**    * 进行判断是普通Item视图还是FootVIEw视图    *    * @param position    * @return    */   @OverrIDe   public int getItemVIEwType(int position) {     // 最后一个item设置为footerVIEw     if (position + 1 == getItemCount()) {       return TYPE_FOOTER_EMPTY;     } else if (position + 2 == getItemCount()) {       return TYPE_FOOTER;     } else {       return TYPE_ITEM;     }   } <span > </span>//如果是页数的倍数 itemcount+2   @OverrIDe   public int getItemCount() {     if (mTitles.size() % pagesize != 0) {       return mTitles.size();     } else {       return mTitles.size() + 2;     }     // return mTitles.size()+1;   }   // 自定义的VIEwHolder,持有每个Item的的所有界面元素   public static class ItemVIEwHolder extends RecyclerVIEw.VIEwHolder {     public TextVIEw item_tv;     public ItemVIEwHolder(VIEw vIEw) {       super(vIEw);       item_tv = (TextVIEw) vIEw.findVIEwByID(R.ID.item_tv);     }   }   /**    * 底部FootVIEw布局    */   public static class FootVIEwHolder extends RecyclerVIEw.VIEwHolder {     private TextVIEw foot_vIEw_item_tv;     public FootVIEwHolder(VIEw vIEw) {       super(vIEw);       foot_vIEw_item_tv = (TextVIEw) vIEw           .findVIEwByID(R.ID.foot_vIEw_item_tv);     }   } <span > </span>//空白项   public static class FootEmptyHolder extends RecyclerVIEw.VIEwHolder {     private VIEw empty;     public FootEmptyHolder(VIEw vIEw) {       super(vIEw);       empty = vIEw.findVIEwByID(R.ID.empty);     }   }   // 添加数据   public voID addItem(List<String> newDatas) {     // mTitles.add(position,data);     // notifyItemInserted(position);     newDatas.addAll(mTitles);     mTitles.removeAll(mTitles);     mTitles.addAll(newDatas);     notifyDataSetChanged();   } <span > </span>//更新添加数据   public voID addMoreItem(List<String> newDatas) {     mTitles.addAll(newDatas);     notifyDataSetChanged();   } <span > </span>//更新空白项高度   private voID notifyEmptyVIEw(int height) {     this.evIEw_height = height;     notifyItemChanged(getItemCount() - 1);   } <span > </span>//空白回d 伪回d动画   private voID resetEmptyVIEw() {     final int dx = evIEw_height;     new Thread(new Runnable() {       @OverrIDe       public voID run() {         // Todo auto-generated method stub         final int time = 500;         final long startTime = new Date().getTime();         TimeFlag = startTime;         long NowTime = new Date().getTime();         while (startTime + time > NowTime && TimeFlag == startTime) {           NowTime = new Date().getTime();           final int dt = (int) (NowTime - startTime);           parent.post(new Runnable() {             @OverrIDe             public voID run() {               // Todo auto-generated method stub               evIEw_height = evIEw_height * (time - dt) / time;               notifyDataSetChanged();             }           });           try {             Thread.sleep(10);           } catch (InterruptedException e) {             // Todo auto-generated catch block             e.printstacktrace();           }         }         parent.post(new Runnable() {           @OverrIDe           public voID run() {             // Todo auto-generated method stub             evIEw_height = 0;             notifyDataSetChanged();           }         });       }     }).start();   } <span > </span>//停止加载更多 重置loading状态和显示文本   public voID stopLoadMore() {     notifyDataSetChanged();     loading = false;     RefreshFootAdapter.this     .changeMoreStatus(RefreshFootAdapter.this.SATUS_PulLUP_LOAD_MORE);   }   //改变加载条状态   private voID changeMoreStatus(int status) {     if (loading) {       return;     }     load_more_status = status;     notifyDataSetChanged();   } } 

图1为滑动过程

图2为松开加载

以上所述是小编给大家介绍的AndroID RecyclerVIEw上拉加载更多功能回d实现代码,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对编程小技巧网站的支持!

总结

以上是内存溢出为你收集整理的Android RecyclerView上拉加载更多功能回d实现代码全部内容,希望文章能够帮你解决Android RecyclerView上拉加载更多功能回d实现代码所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://www.outofmemory.cn/web/1147024.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-31
下一篇 2022-05-31

发表评论

登录后才能评论

评论列表(0条)

保存