Android Recyclerview實(shí)現(xiàn)上拉加載更多功能
在項(xiàng)目中使用列表的下拉刷新和上拉加載更多是很常見的功能,下拉刷新我們可以用Android自帶的SwipeRefreshLayout這個(gè)很好解決。但是上拉加載更多就要去找一些框架了,剛開始的時(shí)候我找到一個(gè)Mugen的github開源框架,但是有個(gè)問題,當(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ì)大家有所幫助,如果大家有任何疑問請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
相關(guān)文章
Android實(shí)現(xiàn)直接播放麥克風(fēng)采集到的聲音
這篇文章主要介紹了Android實(shí)現(xiàn)直接播放麥克風(fēng)采集到的聲音,涉及Android音頻操作的相關(guān)技巧,需要的朋友可以參考下2015-06-06
快速了解Android?Room使用細(xì)則進(jìn)階
這篇文章主要為大家介紹了快速了解Android?Room使用細(xì)則進(jìn)階,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-03-03
基于Alarmmanager實(shí)現(xiàn)簡(jiǎn)單鬧鐘功能
這篇文章主要為大家詳細(xì)介紹了基于Alarmmanager實(shí)現(xiàn)簡(jiǎn)單鬧鐘功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-06-06
Android應(yīng)用中clearFocus方法調(diào)用無效的問題解決
clearFocus()主要用于清除EditText的焦點(diǎn),Android App開發(fā)中很多時(shí)候會(huì)發(fā)現(xiàn)其調(diào)用無效,帶著這個(gè)問題我們就來看一下本文主題、Android應(yīng)用中clearFocus方法調(diào)用無效的問題解決2016-05-05
Android Insets相關(guān)知識(shí)總結(jié)
這篇文章主要介紹了Android Insets相關(guān)知識(shí)總結(jié),幫助大家更好的理解和學(xué)習(xí)使用Android,感興趣的朋友可以了解下2021-03-03
Android開發(fā)使用自定義View將圓角矩形繪制在Canvas上的方法
這篇文章主要介紹了Android開發(fā)使用自定義View將圓角矩形繪制在Canvas上的方法,結(jié)合實(shí)例形式分析了Android自定義view繪制圓角矩形的相關(guān)方法與使用技巧,需要的朋友可以參考下2017-10-10
Android編程解析XML文件的方法詳解【基于XmlPullParser】
這篇文章主要介紹了Android編程解析XML文件的方法,結(jié)合實(shí)例形式分析了Android基于XmlPullParser解析xml文件的相關(guān)操作技巧與注意事項(xiàng),需要的朋友可以參考下2017-07-07
房卡麻將分析系列 "牌局回放" 之 數(shù)據(jù)設(shè)計(jì)詳解及實(shí)例
這篇文章主要介紹了房卡麻將分析系列 "牌局回放" 之 數(shù)據(jù)設(shè)計(jì)詳解及實(shí)例的相關(guān)資料,需要的朋友可以參考下2017-03-03

