实现原理是使用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实现代码所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)