答案很简单,你必须从一个回收视图获取滚动反馈并将其传递给其他回收视图。但非常仔细。
您需要保留哪个 recyclerview 开始提供滚动反馈的引用,这样它就不会进入连续循环。
所以创建一个全局变量
private int draggingView = -1;
将scrollListener添加到所有recyclerviews中
mRecyclerView1.addOnScrollListener(scrollListener);
mRecyclerView2.addOnScrollListener(scrollListener);
mRecyclerView3.addOnScrollListener(scrollListener);
你的滚动监听器应该在这个结构中。它应该决定哪个recyclerview正在提供滚动输入以及哪个正在接收。
private RecyclerView.OnScrollListener scrollListener = new RecyclerView.OnScrollListener() {
@Override
public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
super.onScrollStateChanged(recyclerView, newState);
if (mRecyclerView1 == recyclerView && newState == RecyclerView.SCROLL_STATE_DRAGGING) {
draggingView = 1;
} else if (mRecyclerView2 == recyclerView && newState == RecyclerView.SCROLL_STATE_DRAGGING) {
draggingView = 2;
} else if (mRecyclerView3 == recyclerView && newState == RecyclerView.SCROLL_STATE_DRAGGING) {
draggingView = 3;
}
}
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
if (draggingView == 1 && recyclerView == mRecyclerView1) {
mRecyclerView2.scrollBy(dx, dy);
} else if (draggingView == 2 && recyclerView == mRecyclerView2) {
mRecyclerView1.scrollBy(dx, dy);
} else if (draggingView == 3 && recyclerView == mRecyclerView3) {
mRecyclerView1.scrollBy(dx, dy);
}
}
};
就这样,您的回收视图已准备好滚动。如果您滚动一个回收视图,它将滚动所有其他回收视图。
移动不是问题,停才是问题。如果用户猛击一个列表,同时如果他停止其他列表,则该列表只会被停止,所以您也需要涵盖这种情况。我希望这个解释和代码能够解决您的问题。