Android Recyclerview實(shí)現(xiàn)上拉加載更多功能
在項(xiàng)目中使用列表的下拉刷新和上拉加載更多是很常見(jiàn)的功能,下拉刷新我們可以用Android自帶的SwipeRefreshLayout這個(gè)很好解決。但是上拉加載更多就要去找一些框架了,剛開始的時(shí)候我找到一個(gè)Mugen的github開源框架,但是有個(gè)問(wèn)題,當(dāng)頁(yè)面能夠一次加載全部item的時(shí)候,上拉加載的功能就失效了。
這是因?yàn)楫?dāng)界面一次能夠加載完全部item的時(shí)候,繼續(xù)往上拉,Recyclerview的滑動(dòng)監(jiān)聽,中的onScrolled方法只會(huì)在頁(yè)面加載的時(shí)候調(diào)用一次,只后就不會(huì)被調(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 {
//最后一個(gè)顯示的item的position
private int lastVisibleItemPosition;
//觸摸記錄之前的觸摸位置
private float oldY;
//滑動(dòng)狀態(tài)
private int state;
//滑動(dòng)時(shí)Y軸偏移(大于0表示向上滑動(dòng))
private int offsetY = 0;
//touch事件中移動(dòng)的距離(當(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è)置滑動(dòng)監(jiān)聽
recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
super.onScrollStateChanged(recyclerView, newState);
//滑動(dòng)狀態(tài)
state = newState;
//獲得最后一個(gè)顯示的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:
//計(jì)算出移動(dòng)的距離(小于0表示向上拖動(dòng))
moveY = motionEvent.getY() - oldY;
//記錄當(dāng)前觸摸的位置
oldY = motionEvent.getY();
break;
case MotionEvent.ACTION_UP:
//如果是拖動(dòng)或者飛快滑動(dòng)并且顯示的是適配器中最后一條數(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) {//手指移動(dòng)的距離小于0(向上拖動(dòng)recyclerView)
if (mLoadMoreListener != null) {
//回調(diào)加載更多
mLoadMoreListener.loadListener();
}
}
}
}
break;
}
//返回值要為false,不會(huì)攔截滑動(dòng)事件
return false;
}
});
}
private LoadMoreListener mLoadMoreListener;
/**
* 回調(diào)接口
*/
public interface LoadMoreListener {
void loadListener();
}
}
使用的時(shí)候:
//上拉加載更多滑動(dòng)監(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上拉加載更多功能,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
相關(guān)文章
Android開發(fā)中ImageLoder加載網(wǎng)絡(luò)圖片時(shí)將圖片設(shè)置為ImageView背景的方法
這篇文章主要介紹了Android開發(fā)中ImageLoder加載網(wǎng)絡(luò)圖片時(shí)將圖片設(shè)置為ImageView背景的方法,涉及Android ImageView圖片加載及背景設(shè)置相關(guān)操作技巧,需要的朋友可以參考下2018-01-01
解決Android 虛擬按鍵遮住了頁(yè)面內(nèi)容的問(wèn)題
今天小編就為大家分享一篇解決Android 虛擬按鍵遮住了頁(yè)面內(nèi)容的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-07-07
Android快速開發(fā)系列 10個(gè)常用工具類實(shí)例代碼詳解
今天特此整理出10個(gè)基本每個(gè)項(xiàng)目中都會(huì)使用的工具類,用于快速開發(fā),對(duì)android開發(fā)常用工具類感興趣的朋友跟隨小編一起看看吧2018-09-09
淺談android Fragment橫豎屏翻轉(zhuǎn)對(duì)重新加載的要求
下面小編就為大家分享一篇淺談android Fragment橫豎屏翻轉(zhuǎn)對(duì)重新加載的要求,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-01-01
Android自定義ListView實(shí)現(xiàn)仿QQ可拖拽列表功能
這篇文章主要介紹了Android自定義ListView實(shí)現(xiàn)仿QQ可拖拽列表功能,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2016-08-08
Android入門之Adapter的簡(jiǎn)單使用教程
Adapter其實(shí)就是MVC的概念。這篇文章主要為大家簡(jiǎn)單介紹一下Android中Adapter的簡(jiǎn)單使用,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下2022-11-11
Android性能優(yōu)化之利用Rxlifecycle解決RxJava內(nèi)存泄漏詳解
RxJava作為一種響應(yīng)式編程框架,是目前編程界網(wǎng)紅,可謂是家喻戶曉,其簡(jiǎn)潔的編碼風(fēng)格、易用易讀的鏈?zhǔn)椒椒ㄕ{(diào)用、強(qiáng)大的異步支持等使得RxJava被廣泛使用。2017-01-01
Android Studio實(shí)現(xiàn)格式化XML代碼順序
這篇文章主要介紹了Android Studio實(shí)現(xiàn)格式化XML代碼順序,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-03-03

