Android Recyclerview實(shí)現(xiàn)上拉加載更多功能
在項(xiàng)目中使用列表的下拉刷新和上拉加載更多是很常見的功能,下拉刷新我們可以用Android自帶的SwipeRefreshLayout這個(gè)很好解決。但是上拉加載更多就要去找一些框架了,剛開始的時(shí)候我找到一個(gè)Mugen的github開源框架,但是有個(gè)問題,當(dāng)頁面能夠一次加載全部item的時(shí)候,上拉加載的功能就失效了。
這是因?yàn)楫?dāng)界面一次能夠加載完全部item的時(shí)候,繼續(xù)往上拉,Recyclerview的滑動(dòng)監(jiān)聽,中的onScrolled方法只會(huì)在頁面加載的時(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開發(fā)中ImageLoder加載網(wǎng)絡(luò)圖片時(shí)將圖片設(shè)置為ImageView背景的方法
這篇文章主要介紹了Android開發(fā)中ImageLoder加載網(wǎng)絡(luò)圖片時(shí)將圖片設(shè)置為ImageView背景的方法,涉及Android ImageView圖片加載及背景設(shè)置相關(guān)操作技巧,需要的朋友可以參考下2018-01-01Android快速開發(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ì)大家有所幫助。一起跟隨小編過來看看吧2018-01-01Android自定義ListView實(shí)現(xiàn)仿QQ可拖拽列表功能
這篇文章主要介紹了Android自定義ListView實(shí)現(xiàn)仿QQ可拖拽列表功能,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2016-08-08Android性能優(yōu)化之利用Rxlifecycle解決RxJava內(nèi)存泄漏詳解
RxJava作為一種響應(yīng)式編程框架,是目前編程界網(wǎng)紅,可謂是家喻戶曉,其簡潔的編碼風(fēng)格、易用易讀的鏈?zhǔn)椒椒ㄕ{(diào)用、強(qiáng)大的異步支持等使得RxJava被廣泛使用。2017-01-01Android Studio實(shí)現(xiàn)格式化XML代碼順序
這篇文章主要介紹了Android Studio實(shí)現(xiàn)格式化XML代碼順序,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-03-03