RecyclerView加载更多数据的三种不同的实现方式
来源:互联网 发布:淘宝客户分析 编辑:程序博客网 时间:2024/06/04 20:04
上拉加载更多数据通过监听RecyclerView的滚动事件RecyclerView.OnScrollListener()实现的,它提供了两个方法:
/** * 当RecyclerView的滑动状态改变时触发 */ public void onScrollStateChanged(RecyclerView recyclerView, int newState){} /** * 当RecyclerView滑动时触发 * 类似点击事件的MotionEvent.ACTION_MOVE */ public void onScrolled(RecyclerView recyclerView, int dx, int dy){}
RecyclerView的滑动状态有如下三种:
/** * The RecyclerView is not currently scrolling. * 手指离开屏幕 */ public static final int SCROLL_STATE_IDLE = 0; /** * The RecyclerView is currently being dragged by outside input such as user touch input. * 手指触摸屏幕 */ public static final int SCROLL_STATE_DRAGGING = 1; /** * The RecyclerView is currently animating to a final position while not under * outside control. * 手指加速滑动并放开,此时滑动状态伴随SCROLL_STATE_IDLE */ public static final int SCROLL_STATE_SETTLING = 2;
第一种实现:滑动到最后一个item时自动触发的
与手指是否在屏幕上无关,即与滑动状态无关。因此,实现这种效果只需要在public void onScrolled(RecyclerView recyclerView, int dx, int dy) 方法中操作,无需关注当时的滑动状态:
@Override public void onScrolled(RecyclerView recyclerView, int dx, int dy) { super.onScrolled(recyclerView, dx, dy); Log.d("test", "onScrolled"); int lastVisibleItemPosition = layoutManager.findLastVisibleItemPosition(); if (lastVisibleItemPosition + 1 == adapter.getItemCount()) { Log.d("test", "loading executed"); boolean isRefreshing = swipeRefreshLayout.isRefreshing(); if (isRefreshing) { adapter.notifyItemRemoved(adapter.getItemCount()); return; } if (!isLoading) { isLoading = true; handler.postDelayed(new Runnable() { @Override public void run() { getData(); Log.d("test", "load more completed"); isLoading = false; } }, 1000); } } }
第二种实现:当且仅当滑动到最后一项并且手指上拉时才执行上拉加载更多
需要配合onScrollStateChanged(RecyclerView recyclerView, int newState的使用,可以将代码改为:
@Override public void onScrollStateChanged(RecyclerView recyclerView, int newState) { super.onScrollStateChanged(recyclerView, newState); Log.d("test", "StateChanged = " + newState); if (newState == RecyclerView.SCROLL_STATE_IDLE && lastVisibleItemPosition + 1 == adapter.getItemCount()) { Log.d("test", "loading executed"); boolean isRefreshing = swipeRefreshLayout.isRefreshing(); if (isRefreshing) { adapter.notifyItemRemoved(adapter.getItemCount()); return; } if (!isLoading) { isLoading = true; handler.postDelayed(new Runnable() { @Override public void run() { getData(); Log.d("test", "load more completed"); isLoading = false; } }, 1000); } } } @Override public void onScrolled(RecyclerView recyclerView, int dx, int dy) { super.onScrolled(recyclerView, dx, dy); Log.d("test", "onScrolled"); lastVisibleItemPosition = layoutManager.findLastVisibleItemPosition(); }
第三种是:每次滚动到最后一项都触发的加载更多:
@Override public void onScrollStateChanged(RecyclerView recyclerView, int newState) { super.onScrollStateChanged(recyclerView, newState); int lastVisibleItemPosition = layoutManager.findLastVisibleItemPosition(); if (lastVisibleItemPosition + 1 == adapter.getItemCount()) { Log.d("test", "loading executed"); boolean isRefreshing = swipeRefreshLayout.isRefreshing(); if (isRefreshing) { adapter.notifyItemRemoved(adapter.getItemCount()); return; } if (!isLoading) { isLoading = true; handler.postDelayed(new Runnable() { @Override public void run() { getData(); Log.d("test", "load more completed"); isLoading = false; } }, 1000); } } }
参考: 使用SwipeRefreshLayout和RecyclerView实现仿“简书”下拉刷新和上拉加载更多
0 0
- RecyclerView加载更多数据的三种不同的实现方式
- RecyclerView三种显示方式的下拉刷新和上拉加载更多
- 实现ListView 三种不同布局的加载的方式
- RecyclerView的原生加载更多
- SwipeRefreshLayout配合RecyclerView实现下拉刷新和上拉加载更多以及没有数据的显示
- SwipeRefreshLayout配合RecyclerView实现下拉刷新和上拉加载更多以及没有数据的显示
- Android RecyclerView 加载更多数据 及 不同类型itemView的使用
- RecyclerView的下拉刷新数据 与上拉加载更多
- RecyclerView实现加载更多
- RecyclerView实现加载更多
- “加载更多,请稍后......”的实现方式
- RecyclerView 上拉加载更多下拉刷新的一种实现
- RecyclerView的不同position加载不同View实现
- RecyclerView的加载更多的简单思路
- 三种不同的接口实现方式
- 自定义的RecyclerView, 下拉刷新,加载更多.
- Android RecyclerView的下拉加载更多
- recyclerview加载不同的布局
- python lambda函数基础
- Golang 学习笔记 ---类型和一个 HelloWorld
- 使用打印流复制文件
- Android的回调机制
- PySide学习笔记第十一章-PySide中的拖拽(放)操作
- RecyclerView加载更多数据的三种不同的实现方式
- Part 2 How to Monitor Java Garbage Collection
- Intent实现简易文件浏览查看器
- fork()函数
- http load介绍
- 自定义View android 像支付宝支付界面的progress
- hdu 5414 CRB and String(字符串模拟)
- secureCRT报错 The remote system refused the connection
- 2013NOIP D1 T2 火柴排队