結(jié)合 MultiType 實(shí)現(xiàn)加載更多

MultiType 是一個(gè)分發(fā)管理類,幫助我們輕松實(shí)現(xiàn)復(fù)雜布局.建議大家閱讀源碼,作者的思路并不復(fù)雜但很巧妙.

下面附上主要源碼:

public class LoadMoreDelegate {

    private Items mItems;

    private MultiTypeAdapter mMultiTypeAdapter;
    private OnLoadMoreListener mOnLoadMoreListener;
    private ScrollListener mScrollListener;


    public LoadMoreDelegate(MultiTypeAdapter multiTypeAdapter, Items items, OnLoadMoreListener onLoadMoreListener) {
        mMultiTypeAdapter = multiTypeAdapter;
        mItems = items;
        this.mOnLoadMoreListener = onLoadMoreListener;
    }

    public void attach(RecyclerView recyclerView) {
        LinearLayoutManager linearLayoutManager = (LinearLayoutManager) recyclerView.getLayoutManager();
        mScrollListener = new ScrollListener(mMultiTypeAdapter, mItems, linearLayoutManager, mOnLoadMoreListener);
        recyclerView.addOnScrollListener(mScrollListener);
    }

    public void loadMoreComplete() {
        mScrollListener.setLoading(false);
    }

    public void addData(Items items) {
        int originSize = mItems.size() - 1;
        mItems.remove(originSize);//刪除"加載更多"
        mItems.addAll(items);//添加新數(shù)據(jù)
        //從最后的位置插入新數(shù)據(jù)
        mMultiTypeAdapter.notifyItemRangeInserted(originSize, items.size() - 1);
    }

    public interface OnLoadMoreListener {
        void onLoadMore();
    }

    private static class ScrollListener extends RecyclerView.OnScrollListener {
        private final int size = 2;
        private boolean mLoading = false;
        private Items mItems;
        private final LoadMore mLoadMore = new LoadMore();

        private LinearLayoutManager mLinearLayoutManager;
        private OnLoadMoreListener mOnLoadMoreListener;
        private MultiTypeAdapter mMultiTypeAdapter;

        ScrollListener(MultiTypeAdapter multiTypeAdapter, Items datas, LinearLayoutManager linearLayoutManager, OnLoadMoreListener onLoadMoreListener) {
            mItems = datas;
            mMultiTypeAdapter = multiTypeAdapter;
            this.mLinearLayoutManager = linearLayoutManager;
            this.mOnLoadMoreListener = onLoadMoreListener;
        }

        @Override
        public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
            if (dy < 0) {//下滑忽略
                return;
            }
            int totalNum = mLinearLayoutManager.getItemCount();
            int lastVisiblePosition = mLinearLayoutManager.findLastCompletelyVisibleItemPosition();
            if (!mLoading && lastVisiblePosition == totalNum - size) {//最后可見(jiàn)的view的位置為倒數(shù)第size個(gè),觸發(fā)加載更多
                mLoading = true;
                mItems.add(mLoadMore);
                mMultiTypeAdapter.notifyItemInserted(mItems.size() - 1);
                mOnLoadMoreListener.onLoadMore();
            }
        }

        void setLoading(boolean loading) {
            this.mLoading = loading;
        }
    }

}

這里提下有些加載更多只是簡(jiǎn)單的直接使用 notifyDataSetChanged() 方法,效率上我沒(méi)有研究過(guò),不敢說(shuō)哪個(gè)效率更好,但至少 RecycleView 給我們提供的動(dòng)畫效果沒(méi)有了,所以建議還是采用 notifyItemInserted().

完整示例:multitypeloadmore

public class PullUpTestActivity extends AppCompatActivity implements LoadMoreDelegate.OnLoadMoreListener {

    private Items mItems = new Items();

    private LoadMoreDelegate mLoadMoreDelegate;
    @Bind(R.id.show)
    RecyclerView mShow;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_pull_up);
        ButterKnife.bind(this);
        for (int i = 0; i < 20; i++) {
            mItems.add("data***" + i);
        }


        MultiTypeAdapter multiTypeAdapter = new MultiTypeAdapter(mItems);
        multiTypeAdapter.register(String.class, new NormalViewProvider());
        multiTypeAdapter.register(LoadMore.class, new LoadMoreViewProvider());
        mShow.setLayoutManager(new LinearLayoutManager(this));
        mShow.setAdapter(multiTypeAdapter);
        mLoadMoreDelegate = new LoadMoreDelegate(multiTypeAdapter, mItems, this);
        mLoadMoreDelegate.attach(mShow);
    }

    @Override
    public void onLoadMore() {
        getMore();
    }

    private void getMore() {
        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    Thread.sleep(2000);
                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            Items strings = new Items();
                            for (int i = 0; i < 20; i++) {
                                strings.add("data***more" + i);
                            }
                            mLoadMoreDelegate.addData(strings);
                            mLoadMoreDelegate.loadMoreComplete();
                        }
                    });

                } catch (InterruptedException e) {
                    e.printStackTrace();
                }


            }
        }).start();
    }
}

還有一點(diǎn)提一下,這樣的必須需要滑動(dòng)界面才可以觸發(fā)加載更多,如果第一屏數(shù)據(jù)不超過(guò)一屏,將沒(méi)法觸發(fā)加載更多.但這樣我認(rèn)為是合理的,如果第一頁(yè)數(shù)據(jù)的請(qǐng)求就不滿一屏,所以后面應(yīng)該是在沒(méi)有數(shù)據(jù)的.有些加載更多的實(shí)現(xiàn)是一到最后一個(gè)數(shù)據(jù),就開始加載更多.但在第一頁(yè)數(shù)據(jù)不滿一屏的情況下,觸發(fā)了加載很多,很違背直覺(jué). BaseRecyclerViewAdapterHelper 就采用了這種實(shí)現(xiàn),大家可以去看源碼. 而且一般第一頁(yè)的請(qǐng)求,我們一般會(huì)有自己的一個(gè) loading 視圖,這樣不滿一屏的情況下,還有一個(gè)加載更多的視圖,這是不太合理的.

以上 demo 僅供參考,大家可以進(jìn)一步自己封裝和實(shí)現(xiàn).可以自己實(shí)現(xiàn)個(gè) MultiTypeAdapter 并把代碼整合到里面去,這樣用起來(lái)可能會(huì)更方便點(diǎn).

效果圖

loadmore.gif
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子潮饱,更是在濱河造成了極大的恐慌擅耽,老刑警劉巖盗飒,帶你破解...
    沈念sama閱讀 212,816評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件挨摸,死亡現(xiàn)場(chǎng)離奇詭異栅炒,居然都是意外死亡帘不,警方通過(guò)查閱死者的電腦和手機(jī)说莫,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,729評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)寞焙,“玉大人储狭,你說(shuō)我怎么就攤上這事〉方迹” “怎么了辽狈?”我有些...
    開封第一講書人閱讀 158,300評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)呛牲。 經(jīng)常有香客問(wèn)我刮萌,道長(zhǎng),這世上最難降的妖魔是什么侈净? 我笑而不...
    開封第一講書人閱讀 56,780評(píng)論 1 285
  • 正文 為了忘掉前任尊勿,我火速辦了婚禮,結(jié)果婚禮上畜侦,老公的妹妹穿的比我還像新娘元扔。我一直安慰自己,他們只是感情好旋膳,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,890評(píng)論 6 385
  • 文/花漫 我一把揭開白布澎语。 她就那樣靜靜地躺著,像睡著了一般验懊。 火紅的嫁衣襯著肌膚如雪擅羞。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 50,084評(píng)論 1 291
  • 那天义图,我揣著相機(jī)與錄音减俏,去河邊找鬼。 笑死碱工,一個(gè)胖子當(dāng)著我的面吹牛娃承,可吹牛的內(nèi)容都是我干的奏夫。 我是一名探鬼主播,決...
    沈念sama閱讀 39,151評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼历筝,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼酗昼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起梳猪,我...
    開封第一講書人閱讀 37,912評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤麻削,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后春弥,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體呛哟,經(jīng)...
    沈念sama閱讀 44,355評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,666評(píng)論 2 327
  • 正文 我和宋清朗相戀三年惕稻,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了竖共。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,809評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡俺祠,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出借帘,到底是詐尸還是另有隱情蜘渣,我是刑警寧澤,帶...
    沈念sama閱讀 34,504評(píng)論 4 334
  • 正文 年R本政府宣布肺然,位于F島的核電站蔫缸,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏际起。R本人自食惡果不足惜拾碌,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,150評(píng)論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望街望。 院中可真熱鬧校翔,春花似錦、人聲如沸灾前。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)哎甲。三九已至蔫敲,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間炭玫,已是汗流浹背奈嘿。 一陣腳步聲響...
    開封第一講書人閱讀 32,121評(píng)論 1 267
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留吞加,地道東北人裙犹。 一個(gè)月前我還...
    沈念sama閱讀 46,628評(píng)論 2 362
  • 正文 我出身青樓尽狠,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親伯诬。 傳聞我的和親對(duì)象是個(gè)殘疾皇子晚唇,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,724評(píng)論 2 351

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

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,867評(píng)論 25 707
  • 導(dǎo)入操作 一般的導(dǎo)入的操作和Java一樣。 細(xì)心的同學(xué)可能已經(jīng)發(fā)現(xiàn)了盗似,還是有差別的哩陕。Kotlin在進(jìn)行導(dǎo)入操作時(shí)是...
    CoorChice閱讀 1,274評(píng)論 0 3
  • 姓名:張義躍 公司:本一設(shè)計(jì) 【日精進(jìn)打卡第58天】 【知-學(xué)習(xí)】 《六項(xiàng)精進(jìn)》大綱0遍共22遍 《大學(xué)》0遍共1...
    小小蛋兒閱讀 112評(píng)論 0 0
  • 心在痛,要多長(zhǎng)的時(shí)間才能不再痛赫舒,不再想了呢悍及?
    longlong8612009閱讀 120評(píng)論 0 1
  • 之前電腦桌面是按重要緊急 不重要緊急 不緊急重要 不緊急不重要來(lái)分類操作。每天下班前會(huì)整理出來(lái)接癌,第二天按照整理來(lái)工...
    明蘭雪閱讀 166評(píng)論 0 0