今天終於有點時間,來寫了一下: 為RecyclerView實現下拉重新整理和上拉載入更多。今天會在前面的兩篇文章的基礎上:
RecyclerView系列之(1):為RecyclerView添加Header和Footer
RecyclerView系列之(2):為RecyclerView添加分隔線
繼續講述RecyclerView中一些常用組件的實現下拉重新整理和上拉載入更多的功能。
在現在的Android手機應用中,幾乎每一個APP都有下拉重新整理和上拉載入更多的功能,它們的重要性不言而喻。
先不多說,先看效果圖:
下拉重新整理效果圖
上拉載入更多效果圖
下拉重新整理和上拉載入這兩個功能,一開始給人的感覺就是它們是一個組合,它們之間是不是存在什麼關係,但是事實上,實現的方式是完全不一樣的。下面我將結合核心部分代碼來講一下它們的實現。
一. 實現下拉重新整理
在google的android.support.v4包中,提供一個SwipeRefreshLayout方法, 用於實現下拉重新整理,實現的過程也非常簡單, 那我們先來看一下SwipeRefreshLayout是什麼東西,其實從名字上來看,它就是一個重新整理布局,我們來看它的繼承結構圖:
SwipeRefreshLayout的繼承結構圖
從上面的繼承結構可以看出, 它繼承於:ViewGroup. 而我們常見的LinearLayout, GridLayout等常見的布局,也是繼承於ViewGroup。所以它的使用方法和我們常見的差不多,我們想要重新整理下拉重新整理我們的RecyclerView, 那我們就要將我們的RecyclerView布局檔案放到SwipeLayout中。
而在SwipeRefleshLayout中,它又提供了一個介面:SwipeRefreshLayout.OnRefreshListener, 並且在這個口裡面提供了一個抽象方法:onRefresh(), 到這裡, 我們大概知道它是怎麼運作的了,我們只需要在Activity中,實現這個介面,並且實現OnRefresh()方法即可,在onReflesh()方法中,進行我們的重新整理資料操作,下面直接來看主要代碼:
在主布局中的檔案:加入以下代碼:
<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中
實現以下核心代碼:
1.建立一個SwipeRefreshLayout對象,在onCreate()方法中初始化
mRefreshLayout = (SwipeRefreshLayout)findViewById(R.id.layout_swipe_refresh);
2.為其添加SwipeRefreshLayout.OnRefreshListener事件:
mRefreshLayout.setOnRefreshListener(new OnRefreshListener(){ public void onRefresh() { //我在List最前面加入一條資料 mData.add(0, "嘿,我是“下拉重新整理”生出來的"); //資料重新載入完成後,提示資料發生改變,並且設定現在不在重新整理 mAdapter.notifyDataSetChanged(); mRefreshLayout.setRefreshing(false); }});
到這裡,就實現了下拉重新整理的功能,具體的Adapter的實現,分隔線的加入,請看我前面的兩篇文章,或者是看後面附帶的源碼
這樣,我們就實現了下拉重新整理的功能,下面再來實現上拉載入更多的功能。
二. 上拉載入更多
上拉載入,主要實現的是一個類似分頁的功能,不能一開始的時候就載入全部資料,如果資料很多,或者是網路速度慢的話,這需要很久的時間才能載入完成。而上拉載入的思想是:我一開始的時候,就給你載入二十條資料左右,如果你還想看下面的資料的畫,再次進行載入二十條,分批次載入,這樣就提升了使用者體驗。
下面在RecyclerView中,提供了另外一個監聽介面:RecyclerView.OnScrollListener
我們可以通過這個介面來建立我們上拉載入更多的功能。
直接通過代碼來理解,代碼上也有比較詳細的解析
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{ //聲明一個LinearLayoutManager private LinearLayoutManager mLinearLayoutManager; //當前頁,從0開始 private int currentPage = 0; //已經載入出來的Item的數量 private int totalItemCount; //主要用來儲存上一個totalItemCount private int previousTotal = 0; //在螢幕上可見的item數量 private int visibleItemCount; //在螢幕可見的Item中的第一個 private int firstVisibleItem; //是否正在上拉資料 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){ //說明資料已經載入結束 loading = false; previousTotal = totalItemCount; } } //這裡需要好好理解 if (!loading && totalItemCount-visibleItemCount <= firstVisibleItem){ currentPage ++; onLoadMore(currentPage); loading = true; } } /** * 提供一個抽閑方法,在Activity中監聽到這個EndLessOnScrollListener * 並且實現這個方法 * */ public abstract void onLoadMore(int currentPage);}
在上面的代碼中,需要注意的就是理解:visibleItemCount, totalItemCount, firstVisibleItem這幾個單詞的意思, 在代碼裡看解析,如果看不懂,可以在程式內打Log,滑動螢幕,看Log, 這樣來理解比較好理解
監聽器已經弄好了,接下來,我們就是在Activity中為RecyclerView添加這個監聽器,實現抽象方法onLoadMore()這樣就可以了。下面看主要代碼:
mRecyclerView.addOnScrollListener(new EndLessOnScrollListener(mLinearLayoutManager) { @Override public void onLoadMore(int currentPage) { loadMoreData(); }});
上面的程式中loadMoreData()方法為:
//每次上拉載入的時候,給RecyclerView的後面添加了10條資料資料private void loadMoreData(){ for (int i =0; i < 10; i++){ mData.add("嘿,我是“上拉載入”生出來的"+i); mAdapter.notifyDataSetChanged(); }}
到這裡,整個RecyclerView添加下拉重新整理和上拉載入的功能就實現了,具體源碼:請看github地址: 源碼下載.
到這裡,我們的整個RecyclerView系列之(3)就實現了, 這三篇文章,它能做到的,ListView都可以做到,並沒有體現出RecyclerView的靈活性,關於RecyclerView的靈活性, 很多人會想到一個詞:瀑布流,看下圖
圖片來自於網路
而下一篇文章我會帶來RecyclerView瀑布流的實現,謝謝咯。
以上就是本文的全部內容,希望對大家的學習有所協助,也希望大家多多支援雲棲社區。