Android 使用三個Reyclerview 實(shí)現(xiàn)表格布局,支持橫向縱向滑動

這個案例是通過子條目item為recycleview實(shí)現(xiàn)多條目聯(lián)動,使得recycleview支持橫向和縱向滑動

話不多說 ,先上Demo演示

image

Demo代碼:https://github.com/LgSecret/Linkagelayout

此Demo實(shí)現(xiàn)效果就是這種,基本無嵌套。擺脫使用HorizontalScrollView 嵌套橫向數(shù)據(jù)過多而導(dǎo)致的性能問題,自測demo數(shù)據(jù)橫向50條 縱向150條都很絲滑,并且支持內(nèi)部recycleview自定義多布局實(shí)現(xiàn)復(fù)雜布局效果。

下面是Demo布局

image

上下滑動整體是一個recycleview 可以直接實(shí)現(xiàn),而左右滑動聯(lián)動頭部一起滑動就是我們要解決的問題,為了避免嵌套解決性能問題,此demo采用了子條目為recycleview 橫向滑動 然后聯(lián)動其它條目 還有頭部列表一起滑動策略。

接下來貼出關(guān)鍵實(shí)現(xiàn)聯(lián)動代碼

 //多條recycleview聯(lián)動
    public void initRecyclerView(RecyclerView recyclerView) {
        recyclerView.setHasFixedSize(true);
        //為每一個recycleview創(chuàng)建layoutManager
        LinearLayoutManager layoutManager = (LinearLayoutManager) recyclerView.getLayoutManager();
        //todo
        // 通過移動layoutManager來實(shí)現(xiàn)列表滑動  此行是讓新加載的item條目保持跟已經(jīng)滑動的recycleview位置保持一致
        // 也就是上拉加載更多的時候  保證新加載出來的item 跟已經(jīng)滑動的item位置保持一致
        if (layoutManager != null && firstPos > 0 && firstOffset > 0) {
            layoutManager.scrollToPositionWithOffset(firstPos + 1, firstOffset);
        }
        // 添加所有的 recyclerView
        observerList.add(recyclerView);
        //當(dāng)觸摸條目的時候 停止滑動
        recyclerView.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View view, MotionEvent motionEvent) {
                switch (motionEvent.getAction()) {
                    case MotionEvent.ACTION_DOWN:
                    case MotionEvent.ACTION_POINTER_DOWN:
                        for (RecyclerView rv : observerList) {
                            rv.stopScroll();
                        }
                }
                return false;
            }
        });
        //添加當(dāng)前滑動recycleview的滑動監(jiān)聽
        recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
            @Override
            public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
                super.onScrolled(recyclerView, dx, dy);
                LinearLayoutManager linearLayoutManager = (LinearLayoutManager) recyclerView.getLayoutManager();
                //獲取顯示第一個item的位置
                int firstPos1 = linearLayoutManager.findFirstVisibleItemPosition();
                View firstVisibleItem = linearLayoutManager.getChildAt(0);
                if (firstVisibleItem != null) {
                    //獲取第一個item的偏移量
                    int firstRight = linearLayoutManager.getDecoratedRight(firstVisibleItem);
                    //遍歷其它的所有的recycleview條目
                    for (RecyclerView rv : observerList) {
                        if (recyclerView != rv) {
                            LinearLayoutManager layoutManager = (LinearLayoutManager) rv.getLayoutManager();
                            if (layoutManager != null) {
                                firstPos = firstPos1;
                                firstOffset = firstRight;
                                //通過當(dāng)前顯示item的位置和偏移量的位置來置頂recycleview 也就是同步其它item的移動距離
                                layoutManager.scrollToPositionWithOffset(firstPos + 1, firstRight);
                            }
                        }
                    }
                }
            }

            @Override
            public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
                super.onScrollStateChanged(recyclerView, newState);
            }
        });
    }

上方的代碼還有注釋已經(jīng)很好的解釋了如何進(jìn)行多個recycleview進(jìn)行聯(lián)動的方式,主要還是通過

 layoutManager.scrollToPositionWithOffset(firstPos + 1, firstRight);

此方法來實(shí)現(xiàn)其它recycleview進(jìn)行聯(lián)動 并且聯(lián)動上方的recycleview

整體思路就是子條目的橫向滑動來聯(lián)動其它條目同步滑動,從而解決整體滑動的問題,避免嵌套HorizontalScrollView 從而提高性能問題。
如果此思路給你帶來了幫助 記得github來個start ~ github 地址在文章開頭
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

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