Android Recyclerview實(shí)現(xiàn)上拉加載更多功能
在項(xiàng)目中使用列表的下拉刷新和上拉加載更多是很常見的功能,下拉刷新我們可以用Android自帶的SwipeRefreshLayout這個很好解決。但是上拉加載更多就要去找一些框架了,剛開始的時候我找到一個Mugen的github開源框架,但是有個問題,當(dāng)頁面能夠一次加載全部item的時候,上拉加載的功能就失效了。
這是因?yàn)楫?dāng)界面一次能夠加載完全部item的時候,繼續(xù)往上拉,Recyclerview的滑動監(jiān)聽,中的onScrolled方法只會在頁面加載的時候調(diào)用一次,只后就不會被調(diào)用了,并且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;
//滑動狀態(tài)
private int state;
//滑動時Y軸偏移(大于0表示向上滑動)
private int offsetY = 0;
//touch事件中移動的距離(當(dāng)前觸摸的位置-oldY)
private float moveY;
/**
* 構(gòu)造方法
* @param recyclerView
* @param loadMoreListener
*/
public LoadMoreForRecyclerView(RecyclerView recyclerView, LoadMoreListener loadMoreListener) {
width(recyclerView, loadMoreListener);
}
/**
*
* @param recyclerView recyclerview
* @param loadMoreListener 回調(diào)監(jiān)聽
*/
public void width(final RecyclerView recyclerView, LoadMoreListener loadMoreListener) {
mLoadMoreListener = loadMoreListener;
//線性布局管理
final LinearLayoutManager linearLayoutManager = (LinearLayoutManager) recyclerView.getLayoutManager();
//recyclerview設(shè)置滑動監(jiān)聽
recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
super.onScrollStateChanged(recyclerView, newState);
//滑動狀態(tài)
state = newState;
//獲得最后一個顯示的item位置
lastVisibleItemPosition = linearLayoutManager.findLastVisibleItemPosition();
}
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
//記錄Y軸偏移量
offsetY = dy;
}
});
//設(shè)置touch監(jiān)聽
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;
//記錄當(dāng)前觸摸的位置
oldY = motionEvent.getY();
break;
case MotionEvent.ACTION_UP:
//如果是拖動或者飛快滑動并且顯示的是適配器中最后一條數(shù)據(jù)
if ((state == 1 || state == 2) && lastVisibleItemPosition == recyclerView.getAdapter().getItemCount() - 1) {
if (offsetY > 0) {//如果偏移量大于0
if (mLoadMoreListener != null) {
//回調(diào)加載更多監(jiān)聽
mLoadMoreListener.loadListener();
}
} else if (offsetY == 0) {//如果偏移量一直等于0
if ((moveY) < 0) {//手指移動的距離小于0(向上拖動recyclerView)
if (mLoadMoreListener != null) {
//回調(diào)加載更多
mLoadMoreListener.loadListener();
}
}
}
}
break;
}
//返回值要為false,不會攔截滑動事件
return false;
}
});
}
private LoadMoreListener mLoadMoreListener;
/**
* 回調(diào)接口
*/
public interface LoadMoreListener {
void loadListener();
}
}
使用的時候:
//上拉加載更多滑動監(jiān)聽
new LoadMoreForRecyclerView(rc, new LoadMoreForRecyclerView.LoadMoreListener() {
@Override
public void loadListener() {
showToast("開始加載");
getData(2);
}
});
rc就是recyclerview,在重寫的方法中,進(jìn)行數(shù)據(jù)處理。
效果圖:

如果去研究SwipeRefreshLayout的源碼,應(yīng)該可以實(shí)現(xiàn)差不多的效果。
以上所述是小編給大家介紹的Android Recyclerview上拉加載更多功能,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
相關(guān)文章
Android開發(fā)中ImageLoder加載網(wǎng)絡(luò)圖片時將圖片設(shè)置為ImageView背景的方法
這篇文章主要介紹了Android開發(fā)中ImageLoder加載網(wǎng)絡(luò)圖片時將圖片設(shè)置為ImageView背景的方法,涉及Android ImageView圖片加載及背景設(shè)置相關(guān)操作技巧,需要的朋友可以參考下2018-01-01
Android快速開發(fā)系列 10個常用工具類實(shí)例代碼詳解
今天特此整理出10個基本每個項(xiàng)目中都會使用的工具類,用于快速開發(fā),對android開發(fā)常用工具類感興趣的朋友跟隨小編一起看看吧2018-09-09
淺談android Fragment橫豎屏翻轉(zhuǎn)對重新加載的要求
下面小編就為大家分享一篇淺談android Fragment橫豎屏翻轉(zhuǎn)對重新加載的要求,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-01-01
Android自定義ListView實(shí)現(xiàn)仿QQ可拖拽列表功能
這篇文章主要介紹了Android自定義ListView實(shí)現(xiàn)仿QQ可拖拽列表功能,非常不錯,具有參考借鑒價值,需要的朋友可以參考下2016-08-08
Android性能優(yōu)化之利用Rxlifecycle解決RxJava內(nèi)存泄漏詳解
RxJava作為一種響應(yīng)式編程框架,是目前編程界網(wǎng)紅,可謂是家喻戶曉,其簡潔的編碼風(fēng)格、易用易讀的鏈?zhǔn)椒椒ㄕ{(diào)用、強(qiáng)大的異步支持等使得RxJava被廣泛使用。2017-01-01
Android Studio實(shí)現(xiàn)格式化XML代碼順序
這篇文章主要介紹了Android Studio實(shí)現(xiàn)格式化XML代碼順序,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-03-03

