【问题标题】:Synchronize scrolling on multiple RecyclerViews in adapter在适配器中的多个 RecyclerView 上同步滚动
【发布时间】:2017-11-15 09:48:01
【问题描述】:

我想在一个垂直的RecyclerView中实现一个水平的RecyclerView

最终结果应该是这样的:

所以,对于垂直 RecyclerView 中的每个元素,我需要另一个水平的元素。有点像学校的时间表,左边是一天,右边是实际的时间表,可以水平滚动。

我设法通过在第一个 RecyclerView 项中放置一个 RecyclerView 来实现这一点。一切正常,但所有水平的 RecyclerView 都在单独滚动。我想要做的是让所有水平的RecyclerViews 同时同步和滚动。我怎样才能做到这一点?

我在垂直适配器的onBindViewHolder方法里面设置适配器和水平RecyclerView的方式是这样的:

scheduleAdapter = new ScheduleAdapter(context, data);
holder.scheduleRecyclerView.setAdapter(scheduleAdapter);
holder.scheduleRecyclerView.setLayoutManager(new LinearLayoutManager(context, LinearLayoutManager.HORIZONTAL, false));

【问题讨论】:

    标签: android android-recyclerview synchronization horizontal-scrolling


    【解决方案1】:

    每个recyclerview 都应该添加下面的scroll listener

    m_jParentRecyclerViewLayoutManager 是其项目具有recyclerview 的父RecyclerView。

    RecyclerView.OnScrollListener scrollListener = new RecyclerView.OnScrollListener {
    
        @Override
            public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
                super.onScrolled(recyclerView, dx, dy);
    
                scrollAllRecyclerView(recyclerView, dx, dy);
            }
    
            private void scrollAllRecyclerView(RecyclerView recyclerView, int dx, int dy) {
    
                    // Scroll children RecyclerViews except the recyclerView that is listened.
                    for (int i = 0; i < m_jParentRecyclerViewLayoutManager.getChildCount(); i++) {
                        RecyclerView child = (RecyclerView) m_jParentRecyclerViewLayoutManager.getChildAt(i);
                        if (child != recyclerView) {
                            scroll(child, dx, dy);
                        }
                    }
                }
            }
    
            private void scroll(RecyclerView recyclerView, int dx, int dy) {
                recyclerView.removeOnScrollListener(this);
                recyclerView.scrollBy(dx, dy);
                recyclerView.addOnScrollListener(this);
            }
    

    编辑:在您的父 recyclerview 适配器中。

     @Override
            public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
                RecyclerView recyclerView = new RecyclerView(mContext);
                .. set layout manager & your adapter .
    
                if (scrollListener != null) {
                    recyclerView.removeOnScrollListener(scrollListener );
                    recyclerView.addOnScrollListener(scrollListener );
                }
                return new RecyclerViewViewHolder(recyclerView);
            }
    

    编辑 2:有一个 Table View library 滚动所有子回收视图同步。 你可以查看源代码

    【讨论】:

    • 我应该把这个新的滚动监听器放在哪里?在父 RecyclerView 适配器中还是在我为父 RecyclerView 设置适配器的片段中?另外,如何将新的滚动侦听器添加到子适配器?谢谢
    • 您应该在父 RecyclerView' onCreateViewHolder 中添加此滚动侦听器,您可以在其中为父项的每个项目创建一个 recyclerview。我已经编辑了我的答案。
    • 好的,我在 onCreateViewHolder 方法中移动了子 RecyclerViews 的创建。但是这里,如何引用父级RecyclerView,m_jParentRecyclerViewLayoutManager
    • 我用你的 EDIT 部分更新了我的代码,但我仍然不知道如何在它自己的适配器中引用父 RecyclerView。
    • 好的。我终于设法做到了。但问题是当我滚动时,滚动到队列的末尾并冻结应用程序。我会为你的努力提高答案。谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-09-30
    • 1970-01-01
    • 2018-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多