這個案例是通過子條目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