当前位置: 移动技术网 > 移动技术>移动开发>Android > Android Recyclerview实现上拉加载更多功能

Android Recyclerview实现上拉加载更多功能

2019年07月24日  | 移动技术网移动技术  | 我要评论

在项目中使用列表的下拉刷新和上拉加载更多是很常见的功能,下拉刷新我们可以用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上拉加载更多功能,希望对大家有所帮助

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网