Android 使用三個(gè)Reyclerview 實(shí)現(xiàn)表格布局钧舌,支持橫向縱向滑動(dòng)

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

話不多說 驳庭,先上Demo演示

image

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

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

下面是Demo布局

image

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

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

 //多條recycleview聯(lián)動(dòng)
    public void initRecyclerView(RecyclerView recyclerView) {
        recyclerView.setHasFixedSize(true);
        //為每一個(gè)recycleview創(chuàng)建layoutManager
        LinearLayoutManager layoutManager = (LinearLayoutManager) recyclerView.getLayoutManager();
        //todo
        // 通過移動(dòng)layoutManager來實(shí)現(xiàn)列表滑動(dòng)  此行是讓新加載的item條目保持跟已經(jīng)滑動(dòng)的recycleview位置保持一致
        // 也就是上拉加載更多的時(shí)候  保證新加載出來的item 跟已經(jīng)滑動(dòng)的item位置保持一致
        if (layoutManager != null && firstPos > 0 && firstOffset > 0) {
            layoutManager.scrollToPositionWithOffset(firstPos + 1, firstOffset);
        }
        // 添加所有的 recyclerView
        observerList.add(recyclerView);
        //當(dāng)觸摸條目的時(shí)候 停止滑動(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)前滑動(dòng)recycleview的滑動(dòng)監(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();
                //獲取顯示第一個(gè)item的位置
                int firstPos1 = linearLayoutManager.findFirstVisibleItemPosition();
                View firstVisibleItem = linearLayoutManager.getChildAt(0);
                if (firstVisibleItem != null) {
                    //獲取第一個(gè)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的移動(dòng)距離
                                layoutManager.scrollToPositionWithOffset(firstPos + 1, firstRight);
                            }
                        }
                    }
                }
            }

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

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

 layoutManager.scrollToPositionWithOffset(firstPos + 1, firstRight);

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

整體思路就是子條目的橫向滑動(dòng)來聯(lián)動(dòng)其它條目同步滑動(dòng)渠啊,從而解決整體滑動(dòng)的問題输吏,避免嵌套HorizontalScrollView 從而提高性能問題。
如果此思路給你帶來了幫助 記得github來個(gè)start ~ github 地址在文章開頭
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末替蛉,一起剝皮案震驚了整個(gè)濱河市贯溅,隨后出現(xiàn)的幾起案子拄氯,更是在濱河造成了極大的恐慌,老刑警劉巖它浅,帶你破解...
    沈念sama閱讀 206,378評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件译柏,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡姐霍,警方通過查閱死者的電腦和手機(jī)鄙麦,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來镊折,“玉大人胯府,你說我怎么就攤上這事『夼撸” “怎么了骂因?”我有些...
    開封第一講書人閱讀 152,702評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長赃泡。 經(jīng)常有香客問我寒波,道長,這世上最難降的妖魔是什么急迂? 我笑而不...
    開封第一講書人閱讀 55,259評(píng)論 1 279
  • 正文 為了忘掉前任影所,我火速辦了婚禮,結(jié)果婚禮上僚碎,老公的妹妹穿的比我還像新娘猴娩。我一直安慰自己,他們只是感情好勺阐,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,263評(píng)論 5 371
  • 文/花漫 我一把揭開白布卷中。 她就那樣靜靜地躺著,像睡著了一般渊抽。 火紅的嫁衣襯著肌膚如雪蟆豫。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,036評(píng)論 1 285
  • 那天懒闷,我揣著相機(jī)與錄音十减,去河邊找鬼。 笑死愤估,一個(gè)胖子當(dāng)著我的面吹牛帮辟,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播玩焰,決...
    沈念sama閱讀 38,349評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼由驹,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了昔园?” 一聲冷哼從身側(cè)響起蔓榄,我...
    開封第一講書人閱讀 36,979評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤并炮,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后甥郑,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體逃魄,經(jīng)...
    沈念sama閱讀 43,469評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,938評(píng)論 2 323
  • 正文 我和宋清朗相戀三年壹若,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了嗅钻。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,059評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡店展,死狀恐怖养篓,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情赂蕴,我是刑警寧澤柳弄,帶...
    沈念sama閱讀 33,703評(píng)論 4 323
  • 正文 年R本政府宣布,位于F島的核電站概说,受9級(jí)特大地震影響碧注,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜糖赔,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,257評(píng)論 3 307
  • 文/蒙蒙 一萍丐、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧放典,春花似錦逝变、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至弥臼,卻和暖如春宴咧,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背径缅。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來泰國打工掺栅, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人纳猪。 一個(gè)月前我還...
    沈念sama閱讀 45,501評(píng)論 2 354
  • 正文 我出身青樓柿冲,卻偏偏與公主長得像,于是被迫代替她去往敵國和親兆旬。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,792評(píng)論 2 345

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