Android Recyclerview实现上拉加载更多功能
程序员文章站
2023-12-12 17:39:28
在项目中使用列表的下拉刷新和上拉加载更多是很常见的功能,下拉刷新我们可以用android自带的swiperefreshlayout这个很好解决。但是上拉加载更多就要去找一些...
在项目中使用列表的下拉刷新和上拉加载更多是很常见的功能,下拉刷新我们可以用android自带的swiperefreshlayout这个很好解决。但是上拉加载更多就要去找一些框架了,刚开始的时候我找到一个mugen的github开源框架,但是有个问题,当页面能够一次加载全部item的时候,上拉加载的功能就失效了。
这是因为当界面一次能够加载完全部item的时候,继续往上拉,recyclerview的滑动监听,中的onscrolled方法只会在页面加载的时候调用一次,只后就不会被调用了,并且dy=0
@override public void onscrolled(recyclerview recyclerview, int dx, int dy) { super.onscrolled(recyclerview, dx, dy); }
代码如下:
package com.appnews.utils; import android.support.v7.widget.linearlayoutmanager; import android.support.v7.widget.recyclerview; import android.util.log; import android.view.motionevent; import android.view.view; import android.widget.toast; /** * created by administrator on 2017/5/17. */ public class loadmoreforrecyclerview { //最后一个显示的item的position private int lastvisibleitemposition; //触摸记录之前的触摸位置 private float oldy; //滑动状态 private int state; //滑动时y轴偏移(大于0表示向上滑动) private int offsety = 0; //touch事件中移动的距离(当前触摸的位置-oldy) private float movey; /** * 构造方法 * @param recyclerview * @param loadmorelistener */ public loadmoreforrecyclerview(recyclerview recyclerview, loadmorelistener loadmorelistener) { width(recyclerview, loadmorelistener); } /** * * @param recyclerview recyclerview * @param loadmorelistener 回调监听 */ public void width(final recyclerview recyclerview, loadmorelistener loadmorelistener) { mloadmorelistener = loadmorelistener; //线性布局管理 final linearlayoutmanager linearlayoutmanager = (linearlayoutmanager) recyclerview.getlayoutmanager(); //recyclerview设置滑动监听 recyclerview.addonscrolllistener(new recyclerview.onscrolllistener() { @override public void onscrollstatechanged(recyclerview recyclerview, int newstate) { super.onscrollstatechanged(recyclerview, newstate); //滑动状态 state = newstate; //获得最后一个显示的item位置 lastvisibleitemposition = linearlayoutmanager.findlastvisibleitemposition(); } @override public void onscrolled(recyclerview recyclerview, int dx, int dy) { super.onscrolled(recyclerview, dx, dy); //记录y轴偏移量 offsety = dy; } }); //设置touch监听 recyclerview.setontouchlistener(new view.ontouchlistener() { @override public boolean ontouch(view view, motionevent motionevent) { switch (motionevent.getaction()) { case motionevent.action_move: //计算出移动的距离(小于0表示向上拖动) movey = motionevent.gety() - oldy; //记录当前触摸的位置 oldy = motionevent.gety(); break; case motionevent.action_up: //如果是拖动或者飞快滑动并且显示的是适配器中最后一条数据 if ((state == 1 || state == 2) && lastvisibleitemposition == recyclerview.getadapter().getitemcount() - 1) { if (offsety > 0) {//如果偏移量大于0 if (mloadmorelistener != null) { //回调加载更多监听 mloadmorelistener.loadlistener(); } } else if (offsety == 0) {//如果偏移量一直等于0 if ((movey) < 0) {//手指移动的距离小于0(向上拖动recyclerview) if (mloadmorelistener != null) { //回调加载更多 mloadmorelistener.loadlistener(); } } } } break; } //返回值要为false,不会拦截滑动事件 return false; } }); } private loadmorelistener mloadmorelistener; /** * 回调接口 */ public interface loadmorelistener { void loadlistener(); } }
使用的时候:
//上拉加载更多滑动监听 new loadmoreforrecyclerview(rc, new loadmoreforrecyclerview.loadmorelistener() { @override public void loadlistener() { showtoast("开始加载"); getdata(2); } });
rc就是recyclerview,在重写的方法中,进行数据处理。
效果图:
如果去研究swiperefreshlayout的源码,应该可以实现差不多的效果。
以上所述是小编给大家介绍的android recyclerview上拉加载更多功能,希望对大家有所帮助