欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

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

程序员文章站 2024-02-10 10:54:58
在项目中使用列表的下拉刷新和上拉加载更多是很常见的功能,下拉刷新我们可以用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,在重写的方法中,进行数据处理。

效果图:

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

如果去研究swiperefreshlayout的源码,应该可以实现差不多的效果。

以上所述是小编给大家介绍的android recyclerview上拉加载更多功能,希望对大家有所帮助