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

时间:2015-12-23 18:21:11

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

您好我有垂直列表(Custom ArrayAdapter),其中每个元素都有一个水平的RecyclerView,给我一个像格式的表。 我想要做的是,如果一行水平滚动,休息行也应如此。我尝试将它们放在水平滚动视图中,并提供各种技巧,但没有运气。

如果可能的话,我也希望这种同步保持第一个元素是固定的。 Out of sync horizontal RecyclerViews inside a list

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

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

在我的listadapter中,我添加了

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。

相关问题