带自定义网格的RecyclerView LayoutManager在onFling上丢失视图和滚动同步

时间:2017-11-10 20:30:59

标签: android android-recyclerview gridlayoutmanager

我在ConstraintLayout中有一个包含3个RecyclerViews的Activity。一个位于活动的左侧,使用垂直LinearLayoutManager。一个位于活动的顶部,使用水平LinearLayoutManger。最后一个在第一个和第二个的右边,并使用自定义LayoutManager实现水平和垂直滚动的网格。这会创建一个电子表格效果,我需要RecyclerViews同时向一个方向滚动。除了快速投掷动作的情况外,这大部分都有效。当检测到甩尾时,存在两个问题:

  1. 使用自定义LayoutManager的RecyclerView似乎滞后,并且有一段时间在此回收站中看不到任何视图。
    • 我怀疑这是因为每次看到大约45个视图的大小是可见的,所以在快速推送时,所有这些视图都在不断回收。
  2. RecyclerViews之间的滚动同步已经丢失,有时它们会稍微关闭,但如果列表很大,那么它们可能会被关闭很多。这是更重要的问题,因为视图必须正确对齐才能对用户有用。导致这种情况的速度远低于问题#1
  3. 当前代码

    附加到所有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"但没有进一步的评论,我不认为这表现得很符合预期。

    非常感谢任何解决这两个问题的帮助。

0 个答案:

没有答案