在垂直列表视图中同步水平 RecyclerView

Sync al horizontal RecyclerView inside vertical list view

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

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

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

在 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 一样。