我在ConstraintLayout中有一个包含3个RecyclerViews的Activity。一个位于活动的左侧,使用垂直LinearLayoutManager。一个位于活动的顶部,使用水平LinearLayoutManger。最后一个在第一个和第二个的右边,并使用自定义LayoutManager实现水平和垂直滚动的网格。这会创建一个电子表格效果,我需要RecyclerViews同时向一个方向滚动。除了快速投掷动作的情况外,这大部分都有效。当检测到甩尾时,存在两个问题:
附加到所有3个RecyclerViews的滚动侦听器:
private RecyclerView.OnScrollListener syncScrollListener = new RecyclerView.OnScrollListener() {
@Override
public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
super.onScrollStateChanged(recyclerView, newState);
if (recyclerAssignment == recyclerView && newState == RecyclerView.SCROLL_STATE_DRAGGING) {
draggingView = 1;
} else if (recyclerGrades == recyclerView && newState == RecyclerView.SCROLL_STATE_DRAGGING) {
draggingView = 2;
} else if (recyclerStudent == 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 == recyclerAssignment) {
recyclerGrades.scrollBy(dx, dy);
} else if (draggingView == 2 && recyclerView == recyclerGrades) {
recyclerAssignment.scrollBy(dx, dy);
recyclerStudent.scrollBy(dx, dy);
} else if (draggingView == 3 && recyclerView == recyclerStudent) {
recyclerGrades.scrollBy(dx, dy);
}
}
};
自定义LayoutManager与此完全相同:https://github.com/devunwired/recyclerview-playground/blob/master/app/src/main/java/com/example/android/recyclerplayground/layout/FixedGridLayoutManager.java
我注意到有可能添加一个OnFlingListener,但它看起来像是在调用Recycler的scrollBy函数,它们有不同的参数。
我试图在网格RecyclerView中检测滚动状态何时更改为空闲,然后滚动其他视图,但这会导致无限循环。
我认为扩展RecyclerView以覆盖处理拖拽的方法可能是有意义的,但我不确定该方法中究竟要做什么才能使其正常工作。
我理解为了解决问题#1,我可能需要存储更多的视图。这很好,但我对这个逻辑在LayoutManager中的工作方式感到很困惑。
布局管理器返回一个" delta"当它水平或垂直滚动时变量,并且注释提到这是"用于处理flings"但没有进一步的评论,我不认为这表现得很符合预期。
非常感谢任何解决这两个问题的帮助。