【问题标题】:Sync al horizontal RecyclerView inside vertical list view在垂直列表视图中同步水平 RecyclerView
【发布时间】:2015-12-23 18:21:10
【问题描述】:

嗨,我有一个垂直列表(自定义 ArrayAdapter),其中每个元素都有一个水平 RecyclerView,给我一个类似格式的表格。 我想要做的是,如果一行水平滚动,其余行也应该是。我尝试将它们放在水平滚动视图和各种可用技巧中,但没有成功。

如果可能的话,我也希望这种同步保持第一个元素不变。

【问题讨论】:

    标签: android android-listview android-recyclerview android-scrollview


    【解决方案1】:

    创建RecyclerView.OnScrollListener 的实例。此实例对于所有您的水平回收站视图都是通用的。当onScrolled( ) 被调用时,滚动除调用它的视图之外的所有视图。

    【讨论】:

    • 我可以得到我滚动的回收器视图的 dx 和 dy,但是我在我的父列表视图的 getView 方法的适配器中得到了这个(我在其中创建了这个回收器视图)。那么我该怎么做 1)将此 dx 和 dy 设置为另一个回收器视图,2)在父列表视图的 getView 中获取我的其余回收器视图
    • 您必须将您的RecyclerViews 存储在某个地方。就像在一组或列表中一样。
    【解决方案2】:

    在 Little Child 的回答中添加更多内容,这比预期的要棘手,我必须在我的主 Activity 中创建一个自定义侦听器,该侦听器由 onScroll 调用。这是因为 onScroll 在 getView 方法中,无法访问 listview 中的其他视图,但我的 mainactivty 可以访问它们。

    在我的列表适配器中,我添加了

    public interface RecycleListener {
    
        public void onScroll(int scroll_x);
    }
    

    然后在getView中

        mRecyclerView.setOnScrollListener(new RecyclerView.OnScrollListener() {
            @Override
            public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
                listener.onScroll(recyclerView.computeHorizontalScrollOffset());
    
            }
        });
    

    最后在 MainActivity

    dayAdapter.setRecycleListener(new DayAdapter.RecycleListener() {
            int busy = 0;
            @Override
            public void onScroll(int scroll_x)
            {
                if(busy == 1) return;
                busy = 1;
                 for(int i = 0;i<days.size();i++)
                {
                        View view = lv.getChildAt(i);
                        if(view == null) continue;
                        RecyclerView r = (RecyclerView) view.findViewById(R.id.timetable_row_recycler);
                        LinearLayoutManager  layoutManager =  ( LinearLayoutManager) r.getLayoutManager();
                        layoutManager.scrollToPositionWithOffset(0,0-scroll_x);
                }
                busy = 0;
            }
    
        });
    

    注意我发现您可以使用int scroll_x = recyclerView.computeHorizontalScrollOffset() 轻松获取滚动位置,但是没有直接的方法可以将其应用回来。 layoutManager.scrollToPosition(i) 方法滚动到第 i 个元素而不是滚动位置,所以唯一正确的可能方法是

    layoutManager.scrollToPositionWithOffset(0,0-scroll_x);
    

    或(在自定义布局管理器的情况下)

    ((LinearLayoutManager) layoutManager).scrollToPositionWithOffset(0,0-scroll_x);
    

    我们基本上将负偏移量应用于第 0 个位置,因此它不会滚动到第 0 个之前的偏移量,而是滚动到我们想要的 scroll_x。

    更新
    这很有效,但造成了很多延迟,所以后来我最终切换到了 android.widget.TableLayout,并插入了行(android.widget.TableRow),就像我尝试使用 recyclerview 一样。

    【讨论】:

    • 那个 layoutManager.scrollToPositionWithOffset(0,0-scroll_x);如果行中有很多像我这样的项目会滞后很多,我不能使用那个解决方案
    • @xanexpt,是的,后来我最终切换到 android.widget.TableLayout,并插入了 android.widget.TableRow
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多