使用LoadMoreWrapper為RecyclerView實(shí)現(xiàn)分頁(yè)加載

在我們實(shí)際的業(yè)務(wù)需求中著榴,如果是數(shù)據(jù)比較多啤挎,我們一般是采用分頁(yè)請(qǐng)求饲嗽,然后在客戶端進(jìn)行分頁(yè)展示炭玫。這里筆者使用了一個(gè)叫LoadMoreWrapper這個(gè)分頁(yè)加載框架,使用起來很方便貌虾,基本上不用去對(duì)RecyclerView的Adapter進(jìn)行什么操作吞加。

1、添加依賴

首先我們?cè)赼pp中的 build.gradle中添加對(duì)應(yīng)的依賴:

 //LoadMoreWrapper尽狠,可以為RecyclerView設(shè)置分頁(yè)加載
    implementation 'com.github.nukc:loadmorewrapper:v1.7.0'

另外我們?cè)谥鞴こ痰腷uild.gradle中的allprojects中做如下改動(dòng)

 maven { url "https://jitpack.io" }

看源碼

public class LoadMoreWrapper {

    private final LoadMoreAdapter mLoadMoreAdapter;

    public LoadMoreWrapper(LoadMoreAdapter loadMoreAdapter) {
        mLoadMoreAdapter = loadMoreAdapter;
    }

    public static LoadMoreWrapper with(RecyclerView.Adapter adapter) {
        LoadMoreAdapter loadMoreAdapter = new LoadMoreAdapter(adapter);
        return new LoadMoreWrapper(loadMoreAdapter);
    }

    public LoadMoreWrapper setFooterView(@LayoutRes int resId) {
        mLoadMoreAdapter.setFooterView(resId);
        return this;
    }

    public LoadMoreWrapper setFooterView(View footerView) {
        mLoadMoreAdapter.setFooterView(footerView);
        return this;
    }

    public View getFooterView() {
        return mLoadMoreAdapter.getFooterView();
    }

    public LoadMoreWrapper setNoMoreView(@LayoutRes int resId) {
        mLoadMoreAdapter.setNoMoreView(resId);
        return this;
    }

    public LoadMoreWrapper setNoMoreView(View noMoreView) {
        mLoadMoreAdapter.setNoMoreView(noMoreView);
        return this;
    }

    public View getNoMoreView() {
        return mLoadMoreAdapter.getNoMoreView();
    }

    public LoadMoreWrapper setLoadFailedView(@LayoutRes int resId) {
        mLoadMoreAdapter.setLoadFailedView(resId);
        return this;
    }

    public LoadMoreWrapper setLoadFailedView(View view) {
        mLoadMoreAdapter.setLoadFailedView(view);
        return this;
    }

    public View getLoadFailedView() {
        return mLoadMoreAdapter.getLoadFailedView();
    }

    /**
     * 監(jiān)聽加載更多觸發(fā)事件
     * @param listener {@link com.github.nukc.LoadMoreWrapper.LoadMoreAdapter.OnLoadMoreListener}
     */
    public LoadMoreWrapper setListener(LoadMoreAdapter.OnLoadMoreListener listener) {
        mLoadMoreAdapter.setLoadMoreListener(listener);
        return this;
    }

    /**
     * 設(shè)置是否啟用加載更多
     * @param enabled default true
     */
    public LoadMoreWrapper setLoadMoreEnabled(boolean enabled) {
        mLoadMoreAdapter.setLoadMoreEnabled(enabled);
        if (!enabled) {
            mLoadMoreAdapter.setShouldRemove(true);
        }
        return this;
    }

    /**
     * 設(shè)置全部加載完后是否顯示沒有更多視圖
     * @param enabled default false
     */
    public LoadMoreWrapper setShowNoMoreEnabled(boolean enabled) {
        mLoadMoreAdapter.setShowNoMoreEnabled(enabled);
        return this;
    }

    /**
     * 設(shè)置加載失敗
     */
    public void setLoadFailed(boolean isLoadFailed) {
        mLoadMoreAdapter.setLoadFailed(isLoadFailed);
    }

    /**
     * 獲取原來的 adapter
     */
    public RecyclerView.Adapter getOriginalAdapter() {
        return mLoadMoreAdapter.getOriginalAdapter();
    }

    public LoadMoreAdapter into(RecyclerView recyclerView) {
        recyclerView.setAdapter(mLoadMoreAdapter);
        return mLoadMoreAdapter;
    }
}

可以看到通過本類提供的with方法衔憨,LoadMoreWrapper能夠?qū)崿F(xiàn)對(duì)Adapter的裝飾。里面有很多方法袄膏,都有注釋践图,所以我們需要實(shí)現(xiàn)的功能用起來也很方便。

3.具體使用

LoadMoreWrapper.with(generateAdapter)
                .setFooterView(R.layout.item_load_more)//底部view
                .setNoMoreView(R.layout.item_load_complete)//沒有更多的提示
                .setLoadFailedView(R.layout.item_load_failed)//加載失敗的提示
                .setShowNoMoreEnabled(true)
                .setListener(new OnLoadMoreListener() {
                    @Override
                    public void onLoadMore(LoadMoreAdapter.Enabled enabled) {
                        loadMoreEnabled =  enabled;
                        presenter.getData(new PageParmForm(Constant.key,Constant.limit,Constant.order,Constant.page,Constant.sidx),NetWorkActivity.this);
                    }
                })
                .into(mRecyclerView);

使用起來也是很簡(jiǎn)單的沉馆,我們只需要對(duì)請(qǐng)求所得到的數(shù)據(jù)進(jìn)行判斷码党,然后對(duì)請(qǐng)求頁(yè)碼進(jìn)行自增,就可以實(shí)現(xiàn)分頁(yè)加載顯示斥黑。

 @Override
    public void showApplicationList(UserGuideSoftConfigRForm<List<UserguideSoftConfig>> Response) {

        data=Response.getData();
        if(pageIndex == 1){
            generateAdapter.setData(data);//直接顯示當(dāng)前頁(yè)得items
            generateAdapter.notifyDataSetChanged();//更新數(shù)據(jù)
        }else{//頁(yè)碼不為1得時(shí)候
            generateAdapter.addData(data);
        }
        //頁(yè)碼設(shè)置揖盘,每次獲取到數(shù)據(jù)后,先判斷數(shù)據(jù)集合是否不為空心赶,如果不為空就先使得頁(yè)碼加一岗宣,然后下次獲取數(shù)據(jù)的時(shí)候再進(jìn)行判斷
        //直到如果數(shù)據(jù)為空的時(shí)候就顯示沒有更多數(shù)據(jù)了
        if(data.size() > 0){
            pageIndex ++;
            Constant.page = pageIndex;
        }else{
            //沒有更多數(shù)據(jù)了
            loadMoreEnabled.setLoadMoreEnabled(false);//停止加載更多數(shù)據(jù)
            generateAdapter.notifyItemChanged(generateAdapter.getData().size());//更新指定位置,Adapter一般有得到數(shù)據(jù)和設(shè)置數(shù)據(jù)
        }
    }

當(dāng)沒有數(shù)據(jù)的時(shí)候我們要調(diào)用

generateAdapter.notifyItemChanged(generateAdapter.getData().size());//更新指定位

可能有人會(huì)問為什么是generateAdapter.getData().size()而不是generateAdapter.getData().size() -1呢提完,是因?yàn)樵跊]有數(shù)據(jù)可以展示的時(shí)候渐行,提示View會(huì)占一個(gè)Item,只有這樣嗜愈,這個(gè)提示Item才會(huì)生效。
這樣就實(shí)現(xiàn)了分頁(yè)加載與顯示了。


RecyclerView.PNG

改進(jìn)與問題

在使用LoadMoreWrapper時(shí),筆者進(jìn)行了一番改動(dòng),結(jié)果發(fā)現(xiàn)在調(diào)用
generateAdapter.notifyItemChanged(generateAdapter.getData().size());是出現(xiàn)了一下錯(cuò)誤:

Called attach on a child which is not detached: ViewHolder{40e612c0 position=2 id=-1, oldPos=-1, pLpos:-1 no parent}

自己摸索了半天最終找到了解決方案:

1.第一步:

((SimpleItemAnimator) mRecyclerView.getItemAnimator()).setSupportsChangeAnimations(true);

2.第二步:

我們直接生命一個(gè)LoadMoreAdapter有咨,便于在操作過程中對(duì)他進(jìn)行各種設(shè)置

 private LoadMoreAdapter mLoadMoreWrapper;
...
   //設(shè)置分頁(yè)加載器
        mLoadMoreWrapper = LoadMoreWrapper.with(generateAdapter)
                .setFooterView(R.layout.item_load_more)//底部view
                .setNoMoreView(R.layout.item_load_complete)//沒有更多的提示
                .setLoadFailedView(R.layout.item_load_failed)//加載失敗的提示
                .setLoadMoreEnabled(true)
                .setShowNoMoreEnabled(isShowMore)//是否顯示沒有更多提示頁(yè)
                .setListener(new OnLoadMoreListener() {
                    @Override
                    public void onLoadMore(LoadMoreAdapter.Enabled enabled) {
                        loadMoreEnabled = enabled;//enable為引用
                        //調(diào)用業(yè)務(wù)
                        presenter.getData(new PageParmForm(Constant.key,Constant.limit,Constant.order,Constant.page,Constant.sidx),NetWorkActivity.this);
                    }
                })
                .into(mRecyclerView);
...
@Override
    public void showApplicationList(UserGuideSoftConfigRForm<List<UserguideSoftConfig>> Response) {

        data=Response.getData();//得到應(yīng)用列表

        if(pageIndex == 1){

            generateAdapter.setData(data);//直接顯示當(dāng)前頁(yè)得items

        }else{
            //頁(yè)碼不為1得時(shí)候
            generateAdapter.addData(data);
        }

        if( data.size()<10 && pageIndex == 1 )
        {
            //停止加載更多
            mLoadMoreWrapper.setShowNoMoreEnabled(false);
            loadMoreEnabled.setLoadMoreEnabled(false);//停止加載更多數(shù)據(jù)

        }else if(data.size()>0){

            pageIndex ++;
            Constant.page = pageIndex;
            loadMoreEnabled.setLoadMoreEnabled(true);//加載更多數(shù)據(jù)

        }else {
            //沒有更多數(shù)據(jù)了
            loadMoreEnabled.setLoadMoreEnabled(false);//停止加載更多數(shù)據(jù)
            mLoadMoreWrapper.setShowNoMoreEnabled(true);
            generateAdapter.notifyItemChanged(generateAdapter.getData().size());//更新指定位置,Adapter一般有得到數(shù)據(jù)和設(shè)置數(shù)據(jù)

        }
    }

這樣就解決了這個(gè)問題,而且對(duì)這個(gè)Wrapper能達(dá)到比較好的控制效果蒸健。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末座享,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子似忧,更是在濱河造成了極大的恐慌渣叛,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,284評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件盯捌,死亡現(xiàn)場(chǎng)離奇詭異淳衙,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)饺著,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,115評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門箫攀,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人幼衰,你說我怎么就攤上這事靴跛。” “怎么了渡嚣?”我有些...
    開封第一講書人閱讀 164,614評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵梢睛,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我严拒,道長(zhǎng)扬绪,這世上最難降的妖魔是什么竖独? 我笑而不...
    開封第一講書人閱讀 58,671評(píng)論 1 293
  • 正文 為了忘掉前任裤唠,我火速辦了婚禮,結(jié)果婚禮上莹痢,老公的妹妹穿的比我還像新娘种蘸。我一直安慰自己,他們只是感情好竞膳,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,699評(píng)論 6 392
  • 文/花漫 我一把揭開白布航瞭。 她就那樣靜靜地躺著,像睡著了一般坦辟。 火紅的嫁衣襯著肌膚如雪刊侯。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,562評(píng)論 1 305
  • 那天锉走,我揣著相機(jī)與錄音滨彻,去河邊找鬼藕届。 笑死,一個(gè)胖子當(dāng)著我的面吹牛亭饵,可吹牛的內(nèi)容都是我干的休偶。 我是一名探鬼主播,決...
    沈念sama閱讀 40,309評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼辜羊,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼踏兜!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起八秃,我...
    開封第一講書人閱讀 39,223評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤碱妆,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后昔驱,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體山橄,經(jīng)...
    沈念sama閱讀 45,668評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,859評(píng)論 3 336
  • 正文 我和宋清朗相戀三年舍悯,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了航棱。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,981評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡萌衬,死狀恐怖饮醇,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情秕豫,我是刑警寧澤朴艰,帶...
    沈念sama閱讀 35,705評(píng)論 5 347
  • 正文 年R本政府宣布,位于F島的核電站混移,受9級(jí)特大地震影響祠墅,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜歌径,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,310評(píng)論 3 330
  • 文/蒙蒙 一毁嗦、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧回铛,春花似錦狗准、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,904評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至验残,卻和暖如春捞附,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,023評(píng)論 1 270
  • 我被黑心中介騙來泰國(guó)打工鸟召, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留想鹰,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,146評(píng)論 3 370
  • 正文 我出身青樓药版,卻偏偏與公主長(zhǎng)得像辑舷,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子槽片,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,933評(píng)論 2 355