Android RecyclerView下拉刷新和上拉加載更多
今天終于有點(diǎn)時(shí)間,來寫了一下: 為RecyclerView實(shí)現(xiàn)下拉刷新和上拉加載更多。今天會(huì)在前面的兩篇文章的基礎(chǔ)上:
RecyclerView系列之(1):為RecyclerView添加Header和Footer
RecyclerView系列之(2):為RecyclerView添加分隔線
繼續(xù)講述RecyclerView中一些常用組件的實(shí)現(xiàn)下拉刷新和上拉加載更多的功能。
在現(xiàn)在的Android手機(jī)應(yīng)用中,幾乎每一個(gè)APP都有下拉刷新和上拉加載更多的功能,它們的重要性不言而喻。
先不多說,先看效果圖:
下拉刷新效果圖
上拉加載更多效果圖
下拉刷新和上拉加載這兩個(gè)功能,一開始給人的感覺就是它們是一個(gè)組合,它們之間是不是存在什么關(guān)系,但是事實(shí)上,實(shí)現(xiàn)的方式是完全不一樣的。下面我將結(jié)合核心部分代碼來講一下它們的實(shí)現(xiàn)。
一. 實(shí)現(xiàn)下拉刷新
在google的android.support.v4包中,提供一個(gè)SwipeRefreshLayout方法, 用于實(shí)現(xiàn)下拉刷新,實(shí)現(xiàn)的過程也非常簡單, 那我們先來看一下SwipeRefreshLayout是什么東西,其實(shí)從名字上來看,它就是一個(gè)刷新布局,我們來看它的繼承結(jié)構(gòu)圖:
SwipeRefreshLayout的繼承結(jié)構(gòu)圖
從上面的繼承結(jié)構(gòu)可以看出, 它繼承于:ViewGroup. 而我們常見的LinearLayout, GridLayout等常見的布局,也是繼承于ViewGroup。所以它的使用方法和我們常見的差不多,我們想要刷新下拉刷新我們的RecyclerView, 那我們就要將我們的RecyclerView布局文件放到SwipeLayout中。
而在SwipeRefleshLayout中,它又提供了一個(gè)接口:SwipeRefreshLayout.OnRefreshListener, 并且在這個(gè)口里面提供了一個(gè)抽象方法:onRefresh(), 到這里, 我們大概知道它是怎么運(yùn)作的了,我們只需要在Activity中,實(shí)現(xiàn)這個(gè)接口,并且實(shí)現(xiàn)OnRefresh()方法即可,在onReflesh()方法中,進(jìn)行我們的刷新數(shù)據(jù)操作,下面直接來看主要代碼:
在主布局中的文件:加入以下代碼:
<android.support.v4.widget.SwipeRefreshLayout android:id="@+id/layout_swipe_refresh" android:layout_width="match_parent" android:layout_height="match_parent"> <android.support.v7.widget.RecyclerView android:id="@+id/recyclerview" android:layout_width="match_parent" android:layout_height="match_parent"> </android.support.v7.widget.RecyclerView> </android.support.v4.widget.SwipeRefreshLayout>
就是SwipeRefreshLayout中包含我們的recyclerView
在Activity中
實(shí)現(xiàn)以下核心代碼:
1.創(chuàng)建一個(gè)SwipeRefreshLayout對象,在onCreate()方法中初始化
mRefreshLayout = (SwipeRefreshLayout)findViewById(R.id.layout_swipe_refresh);
2.為其添加SwipeRefreshLayout.OnRefreshListener事件:
mRefreshLayout.setOnRefreshListener(new OnRefreshListener(){ public void onRefresh() { //我在List最前面加入一條數(shù)據(jù) mData.add(0, "嘿,我是“下拉刷新”生出來的"); //數(shù)據(jù)重新加載完成后,提示數(shù)據(jù)發(fā)生改變,并且設(shè)置現(xiàn)在不在刷新 mAdapter.notifyDataSetChanged(); mRefreshLayout.setRefreshing(false); } });
到這里,就實(shí)現(xiàn)了下拉刷新的功能,具體的Adapter的實(shí)現(xiàn),分隔線的加入,請看我前面的兩篇文章,或者是看后面附帶的源碼
這樣,我們就實(shí)現(xiàn)了下拉刷新的功能,下面再來實(shí)現(xiàn)上拉加載更多的功能。
二. 上拉加載更多
上拉加載,主要實(shí)現(xiàn)的是一個(gè)類似分頁的功能,不能一開始的時(shí)候就加載全部數(shù)據(jù),如果數(shù)據(jù)很多,或者是網(wǎng)絡(luò)速度慢的話,這需要很久的時(shí)間才能加載完成。而上拉加載的思想是:我一開始的時(shí)候,就給你加載二十條數(shù)據(jù)左右,如果你還想看下面的數(shù)據(jù)的畫,再次進(jìn)行加載二十條,分批次加載,這樣就提升了用戶體驗(yàn)。
下面在RecyclerView中,提供了另外一個(gè)監(jiān)聽接口:RecyclerView.OnScrollListener
我們可以通過這個(gè)接口來創(chuàng)建我們上拉加載更多的功能。
直接通過代碼來理解,代碼上也有比較詳細(xì)的解析
package com.study.wnw.recyclerviewrefresh; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.util.Log; /** * Created by wnw on 16-5-26. */ public abstract class EndLessOnScrollListener extends RecyclerView.OnScrollListener{ //聲明一個(gè)LinearLayoutManager private LinearLayoutManager mLinearLayoutManager; //當(dāng)前頁,從0開始 private int currentPage = 0; //已經(jīng)加載出來的Item的數(shù)量 private int totalItemCount; //主要用來存儲(chǔ)上一個(gè)totalItemCount private int previousTotal = 0; //在屏幕上可見的item數(shù)量 private int visibleItemCount; //在屏幕可見的Item中的第一個(gè) private int firstVisibleItem; //是否正在上拉數(shù)據(jù) private boolean loading = true; public EndLessOnScrollListener(LinearLayoutManager linearLayoutManager) { this.mLinearLayoutManager = linearLayoutManager; } @Override public void onScrolled(RecyclerView recyclerView, int dx, int dy) { super.onScrolled(recyclerView, dx, dy); visibleItemCount = recyclerView.getChildCount(); totalItemCount = mLinearLayoutManager.getItemCount(); firstVisibleItem = mLinearLayoutManager.findFirstVisibleItemPosition(); if(loading){ //Log.d("wnwn","firstVisibleItem: " +firstVisibleItem); //Log.d("wnwn","totalPageCount:" +totalItemCount); //Log.d("wnwn", "visibleItemCount:" + visibleItemCount); if(totalItemCount > previousTotal){ //說明數(shù)據(jù)已經(jīng)加載結(jié)束 loading = false; previousTotal = totalItemCount; } } //這里需要好好理解 if (!loading && totalItemCount-visibleItemCount <= firstVisibleItem){ currentPage ++; onLoadMore(currentPage); loading = true; } } /** * 提供一個(gè)抽閑方法,在Activity中監(jiān)聽到這個(gè)EndLessOnScrollListener * 并且實(shí)現(xiàn)這個(gè)方法 * */ public abstract void onLoadMore(int currentPage);}
在上面的代碼中,需要注意的就是理解:visibleItemCount, totalItemCount, firstVisibleItem這幾個(gè)單詞的意思, 在代碼里看解析,如果看不懂,可以在程序內(nèi)打Log,滑動(dòng)屏幕,看Log, 這樣來理解比較好理解
監(jiān)聽器已經(jīng)弄好了,接下來,我們就是在Activity中為RecyclerView添加這個(gè)監(jiān)聽器,實(shí)現(xiàn)抽象方法onLoadMore()這樣就可以了。下面看主要代碼:
mRecyclerView.addOnScrollListener(new EndLessOnScrollListener(mLinearLayoutManager) { @Override public void onLoadMore(int currentPage) { loadMoreData(); } });
上面的程序中l(wèi)oadMoreData()方法為:
//每次上拉加載的時(shí)候,給RecyclerView的后面添加了10條數(shù)據(jù)數(shù)據(jù) private void loadMoreData(){ for (int i =0; i < 10; i++){ mData.add("嘿,我是“上拉加載”生出來的"+i); mAdapter.notifyDataSetChanged(); } }
到這里,整個(gè)RecyclerView添加下拉刷新和上拉加載的功能就實(shí)現(xiàn)了,具體源碼:請看github地址: 源碼下載.
到這里,我們的整個(gè)RecyclerView系列之(3)就實(shí)現(xiàn)了, 這三篇文章,它能做到的,ListView都可以做到,并沒有體現(xiàn)出RecyclerView的靈活性,關(guān)于RecyclerView的靈活性, 很多人會(huì)想到一個(gè)詞:瀑布流,看下圖
圖片來自于網(wǎng)絡(luò)
而下一篇文章我會(huì)帶來RecyclerView瀑布流的實(shí)現(xiàn),謝謝咯。
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Android中使用RecyclerView實(shí)現(xiàn)下拉刷新和上拉加載
- Android RecyclerView實(shí)現(xiàn)下拉刷新和上拉加載
- Android RecyclerView 上拉加載更多及下拉刷新功能的實(shí)現(xiàn)方法
- 詳解Recyclerview item中有EditText使用刷新遇到的坑
- Android使用recyclerview打造真正的下拉刷新上拉加載效果
- android RecyclerView側(cè)滑菜單,滑動(dòng)刪除,長按拖拽,下拉刷新上拉加載
- XRecyclerView實(shí)現(xiàn)下拉刷新、滾動(dòng)到底部加載更多等功能
- Android使用RecyclerView實(shí)現(xiàn)自定義列表、點(diǎn)擊事件以及下拉刷新
- Android RecyclerView的刷新分頁的實(shí)現(xiàn)
- RecyclerView使用payload實(shí)現(xiàn)局部刷新
相關(guān)文章
Android實(shí)現(xiàn)網(wǎng)絡(luò)加載時(shí)的對話框功能
這篇文章主要介紹了Android實(shí)現(xiàn)網(wǎng)絡(luò)加載時(shí)的對話框功能,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2017-02-02Flutter自定義實(shí)現(xiàn)彈出層的示例代碼
這篇文章主要為大家詳細(xì)介紹了Flutter如何自定義組件實(shí)現(xiàn)彈出層的效果,?文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-08-08eclipse搭建android開發(fā)環(huán)境詳細(xì)步驟
本文主要介紹了eclipse搭建android開發(fā)環(huán)境詳細(xì)步驟,具有很好的參考價(jià)值。下面跟著小編一起來看下吧2017-03-03Android 實(shí)現(xiàn)帶頭部文字輸入框的自定義控件
這篇文章主要介紹了Android 實(shí)現(xiàn)帶頭部文字輸入框的自定義控件,幫助大家更好的理解和學(xué)習(xí)使用Android,感興趣的朋友可以了解下2021-04-04Android9?雙屏異顯實(shí)現(xiàn)方式思路
這篇文章主要為大家介紹了Android9?雙屏異顯實(shí)現(xiàn)方式詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-06-06android完美實(shí)現(xiàn) 拍照 選擇圖片 剪裁等代碼分享
本文給大家分享了2個(gè)安卓實(shí)現(xiàn)實(shí)現(xiàn) 拍照 選擇圖片 剪裁等的代碼,都是從正式項(xiàng)目中提取出來了,非常實(shí)用,有需要的小伙伴可以參考下。2016-01-01Android開發(fā)使用HttpURLConnection進(jìn)行網(wǎng)絡(luò)編程詳解【附源碼下載】
這篇文章主要介紹了Android開發(fā)使用HttpURLConnection進(jìn)行網(wǎng)絡(luò)編程的方法,結(jié)合實(shí)例形式分析了Android基于HttpURLConnection實(shí)現(xiàn)顯示圖片與文本功能,涉及Android布局、文本解析、數(shù)據(jù)傳輸、權(quán)限控制等相關(guān)操作技巧,需要的朋友可以參考下2018-01-01Android實(shí)現(xiàn)雙擊TitleBar回頂部的功能示例代碼
一個(gè)簡單易用的導(dǎo)航欄TitleBar,可以輕松實(shí)現(xiàn)IOS導(dǎo)航欄的各種效果,下面這篇文章主要給大家介紹了關(guān)于Android如何實(shí)現(xiàn)雙擊TitleBar回頂部功能的相關(guān)資料,文中給出了詳細(xì)的示例代碼,需要的朋友可以參考借鑒,下面來一起看看吧。2017-09-09