一、前言:
这个案例是通过子条目item为recycleview实现多条目联动,使得recycleview支持横向和纵向滑动
话不多说 ,先上Demo演示
Demo代码:https://github.com/LgSecret/Linkagelayout
此Demo实现效果就是这种,基本无嵌套。摆脱使用HorizontalScrollView 嵌套横向数据过多而导致的性能问题,自测demo数据横向50条 纵向150条都很丝滑,并且支持内部recycleview自定义多布局实现复杂布局效果。
二、分析
1、下面是Demo布局
图片.png上下滑动整体是一个recycleview 可以直接实现,而左右滑动联动头部一起滑动就是我们要解决的问题,为了避免嵌套解决性能问题,此demo采用了子条目为recycleview 横向滑动 然后联动其它条目 还有头部列表一起滑动策略。
2、接下来贴出关键实现联动代码
//多条recycleview联动
public void initRecyclerView(RecyclerView recyclerView) {
recyclerView.setHasFixedSize(true);
//为每一个recycleview创建layoutManager
LinearLayoutManager layoutManager = (LinearLayoutManager) recyclerView.getLayoutManager();
//todo
// 通过移动layoutManager来实现列表滑动 此行是让新加载的item条目保持跟已经滑动的recycleview位置保持一致
// 也就是上拉加载更多的时候 保证新加载出来的item 跟已经滑动的item位置保持一致
if (layoutManager != null && firstPos > 0 && firstOffset > 0) {
layoutManager.scrollToPositionWithOffset(firstPos + 1, firstOffset);
}
// 添加所有的 recyclerView
observerList.add(recyclerView);
//当触摸条目的时候 停止滑动
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;
}
});
//添加当前滑动recycleview的滑动监听
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;
//通过当前显示item的位置和偏移量的位置来置顶recycleview 也就是同步其它item的移动距离
layoutManager.scrollToPositionWithOffset(firstPos + 1, firstRight);
}
}
}
}
}
@Override
public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
super.onScrollStateChanged(recyclerView, newState);
}
});
}
上方的代码还有注释已经很好的解释了如何进行多个recycleview进行联动的方式,主要还是通过
layoutManager.scrollToPositionWithOffset(firstPos + 1, firstRight);
此方法来实现其它recycleview进行联动 并且联动上方的recycleview
整体思路就是子条目的横向滑动来联动其它条目同步滑动,从而解决整体滑动的问题,避免嵌套HorizontalScrollView 从而提高性能问题。
网友评论