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

在项目中使用列表的下拉刷新和上拉加载更多是很常见的功能,下拉刷新我们可以用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上拉加载更多功能,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对网站的支持!

以上是 Android Recyclerview实现上拉加载更多功能 的全部内容, 来源链接: utcz.com/z/319732.html

回到顶部