Android RecyclerView下拉重新整理和上拉載入更多_Android

來源:互聯網
上載者:User

今天終於有點時間,來寫了一下: 為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瀑布流的實現,謝謝咯。

以上就是本文的全部內容,希望對大家的學習有所協助,也希望大家多多支援雲棲社區。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.