RecycleView添加下拉刷新、上拉加載更多

一. 實現(xiàn)下拉刷新

在google的android.support.v4包中沪么,提供一個SwipeRefreshLayout方法硼婿, 用于實現(xiàn)下拉刷新,實現(xiàn)的過程也非常簡單, 那我們先來看一下SwipeRefreshLayout是什么東西禽车,其實從名字上來看寇漫,它就是一個刷新布局,我們來看它的繼承結(jié)構(gòu)圖:


SwipeRefreshLayout的繼承結(jié)構(gòu)圖

從上面的繼承結(jié)構(gòu)可以看出殉摔, 它繼承于:ViewGroup. 而我們常見的LinearLayout, GridLayout等常見的布局州胳,也是繼承于ViewGroup。所以它的使用方法和我們常見的差不多逸月,我們想要刷新下拉刷新我們的RecyclerView, 那我們就要將我們的RecyclerView布局文件放到SwipeLayout中栓撞。


而在SwipeRefleshLayout中,它又提供了一個接口:SwipeRefreshLayout.OnRefreshListener碗硬, 并且在這個口里面提供了一個抽象方法:onRefresh()瓤湘, 到這里, 我們大概知道它是怎么運作的了恩尾,我們只需要在Activity中弛说,實現(xiàn)這個接口,并且實現(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>

在Activity中
實現(xiàn)以下核心代碼:

  1. 創(chuàng)建一個SwipeRefreshLayout對象冀偶,在onCreate()方法中初始化
mRefreshLayout = (SwipeRefreshLayout)findViewById(R.id.layout_swipe_refresh);
  1. 為其添加SwipeRefreshLayout.OnRefreshListener事件:
swipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
            @Override
            public void onRefresh() {
                //我在List最前面加入一條數(shù)據(jù)
                datas.add(0, "嘿醒第,我是“下拉刷新”生出來的");

                //數(shù)據(jù)重新加載完成后,提示數(shù)據(jù)發(fā)生改變进鸠,并且設(shè)置現(xiàn)在不在刷新
                adapter.notifyDataSetChanged();
                swipeRefreshLayout.setRefreshing(false);
            }
        });

二淘讥、上拉加載更多

上拉加載,主要實現(xiàn)的是一個類似分頁的功能堤如,不能一開始的時候就加載全部數(shù)據(jù),如果數(shù)據(jù)很多窒朋,或者是網(wǎng)絡(luò)速度慢的話搀罢,這需要很久的時間才能加載完成。而上拉加載的思想是:我一開始的時候侥猩,就給你加載二十條數(shù)據(jù)左右榔至,如果你還想看下面的數(shù)據(jù)的畫,再次進(jìn)行加載二十條欺劳,分批次加載唧取,這樣就提升了用戶體驗铅鲤。

下面在RecyclerView中,提供了另外一個監(jiān)聽接口:RecyclerView.OnScrollListener
我們可以通過這個接口來創(chuàng)建我們上拉加載更多的功能枫弟。

直接通過代碼來理解邢享,代碼上也有比較詳細(xì)的解析

package com.bobzjg.le.recycleviewdemo;

import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;

/**
 * 上拉加載監(jiān)聽接口
 * Created by le on 2016/9/24.
 */

public abstract class EndLessOnScrollListener extends RecyclerView.OnScrollListener {

    //聲明一個LinearLayoutManager
    private LinearLayoutManager mLinearLayoutManager;

    //當(dāng)前頁,從0開始
    private int currentPage = 0;

    //已經(jīng)加載出來的Item的數(shù)量
    private int totalItemCount;

    //主要用來存儲上一個totalItemCount
    private int previousTotal = 0;

    //在屏幕上可見的item數(shù)量
    private int visibleItemCount;

    //在屏幕可見的Item中的第一個
    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){
            if(totalItemCount > previousTotal){
                //說明數(shù)據(jù)已經(jīng)加載結(jié)束
                loading = false;
                previousTotal = totalItemCount;
            }
        }
        //這里需要好好理解
        if (!loading && totalItemCount-visibleItemCount <= firstVisibleItem){
            currentPage ++;
            onLoadMore(currentPage);
            loading = true;
        }
    }

    /**
     * 提供一個抽象方法淡诗,在Activity中監(jiān)聽到這個EndLessOnScrollListener
     * 并且實現(xiàn)這個方法
     * */
    public abstract void onLoadMore(int currentPage);
}

在上面的代碼中骇塘,需要注意的就是理解:visibleItemCount, totalItemCount韩容, firstVisibleItem這幾個單詞的意思款违, 在代碼里看解析,如果看不懂群凶,可以在程序內(nèi)打Log插爹,滑動屏幕,看Log, 這樣來理解比較好理解

監(jiān)聽器已經(jīng)弄好了请梢,接下來赠尾,我們就是在Activity中為RecyclerView添加這個監(jiān)聽器,實現(xiàn)抽象方法onLoadMore()這樣就可以了溢陪。下面看主要代碼:

recyclerView.addOnScrollListener(new EndLessOnScrollListener(layoutManager) {
           @Override
           public void onLoadMore(int currentPage) {
               loadMoreData();
           }
       });

上面的程序中l(wèi)oadMoreData()方法為:

private void loadMoreData() {
        for (int i =0; i < 10; i++){
            datas.add("嘿萍虽,我是“上拉加載”生出來的"+i);
            adapter.notifyDataSetChanged();
        }
    }

OK搞定

到這里,整個RecyclerView添加下拉刷新和上拉加載的功能就實現(xiàn)了形真,具體源碼:請看github地址: 源碼下載.

文/右眼皮的愛(簡書作者)原文鏈接:http://www.reibang.com/p/3bf125b4917d著作權(quán)歸作者所有杉编,轉(zhuǎn)載請聯(lián)系作者獲得授權(quán),并標(biāo)注“簡書作者”咆霜。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末邓馒,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子蛾坯,更是在濱河造成了極大的恐慌光酣,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,214評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件脉课,死亡現(xiàn)場離奇詭異救军,居然都是意外死亡,警方通過查閱死者的電腦和手機倘零,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評論 2 382
  • 文/潘曉璐 我一進(jìn)店門唱遭,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人呈驶,你說我怎么就攤上這事拷泽。” “怎么了?”我有些...
    開封第一講書人閱讀 152,543評論 0 341
  • 文/不壞的土叔 我叫張陵司致,是天一觀的道長拆吆。 經(jīng)常有香客問我,道長脂矫,這世上最難降的妖魔是什么枣耀? 我笑而不...
    開封第一講書人閱讀 55,221評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮羹唠,結(jié)果婚禮上奕枢,老公的妹妹穿的比我還像新娘。我一直安慰自己佩微,他們只是感情好缝彬,可當(dāng)我...
    茶點故事閱讀 64,224評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著哺眯,像睡著了一般谷浅。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上奶卓,一...
    開封第一講書人閱讀 49,007評論 1 284
  • 那天一疯,我揣著相機與錄音,去河邊找鬼夺姑。 笑死墩邀,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的盏浙。 我是一名探鬼主播眉睹,決...
    沈念sama閱讀 38,313評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼废膘!你這毒婦竟也來了竹海?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,956評論 0 259
  • 序言:老撾萬榮一對情侶失蹤丐黄,失蹤者是張志新(化名)和其女友劉穎斋配,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體灌闺,經(jīng)...
    沈念sama閱讀 43,441評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡艰争,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,925評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了桂对。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片园细。...
    茶點故事閱讀 38,018評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖接校,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤蛛勉,帶...
    沈念sama閱讀 33,685評論 4 322
  • 正文 年R本政府宣布鹿寻,位于F島的核電站,受9級特大地震影響诽凌,放射性物質(zhì)發(fā)生泄漏毡熏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,234評論 3 307
  • 文/蒙蒙 一侣诵、第九天 我趴在偏房一處隱蔽的房頂上張望痢法。 院中可真熱鬧,春花似錦杜顺、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至穷当,卻和暖如春提茁,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背馁菜。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評論 1 261
  • 我被黑心中介騙來泰國打工茴扁, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人汪疮。 一個月前我還...
    沈念sama閱讀 45,467評論 2 352
  • 正文 我出身青樓峭火,卻偏偏與公主長得像,于是被迫代替她去往敵國和親铲咨。 傳聞我的和親對象是個殘疾皇子躲胳,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,762評論 2 345

推薦閱讀更多精彩內(nèi)容