Android 将多个水平循环视图一起滚动

Android 将多个水平循环视图一起滚动,android,scroll,android-recyclerview,epg,Android,Scroll,Android Recyclerview,Epg,我正在创建一个类似EPG的视图,其中有多个水平RecyclerViews(作为电视节目)封装在一个线性布局中。当我滚动其中一个RecyclerView时,我希望将其余视图一起滚动 @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); layoutContent.setWeightSum(epg.getCha

我正在创建一个类似EPG的视图,其中有多个水平
RecyclerView
s(作为电视节目)封装在一个线性布局中。当我滚动其中一个RecyclerView时,我希望将其余视图一起滚动

@Override
public void onActivityCreated(Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);

    layoutContent.setWeightSum(epg.getChannels().size());

    //prepare recycler views and add into layoutContent based on epg channels
    for(EPG.Channel ch : epg.getChannels()){
        AppLog.error(TAG, "Creating RecyclerView for: " + ch.getDisplayName());

        //create new recycler view
        final RecyclerView rv = new RecyclerView(layoutContent.getContext());
        lstRecyclerViews.add(rv);

        //set layout manager
        rv.setLayoutManager(new LinearLayoutManager(layoutContent.getContext(), LinearLayoutManager.HORIZONTAL, false));

        //create adapter
        rv.setAdapter(new MyAdapter(ch.getPrograms()));
        rv.setItemAnimator(new DefaultItemAnimator());

        //add into parent layout
        LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, 0);
        lp.weight = 1;
        layoutContent.addView(rv, lp);
    }
}
我尝试将滚动侦听器添加到我的视图中,但我对
RecyclerView.OnScrollListener
onScrolled方法感到困惑,因为我不知道如何滚动其他视图

任何帮助/建议都会有帮助

水平滚动视图

{

线性布局

{

水平回收器视图的垂直列表, 覆盖水平回收器视图的LayoutManager的
方法返回false,以便 全部根据父级滚动视图一起滚动

}

我们主要关注的是水平滚动水平回收器视图的垂直列表, 首先,我试着将它们都放在水平滚动视图上,但android系统显然拒绝了这一点, 所以我保留了一个线性布局(在我的例子中是垂直的)作为中介

因此,epg网格现在可以垂直滚动,因为它们位于一个垂直回收器视图内,也可以水平滚动,因为水平滚动视图。
我们不应该允许水平列表独立滚动,所以我扩展了layoutmanager并禁止水平滚动,现在它们只在祖父母滚动下滚动。

您需要始终重新计算当前项目在水平回收器视图中的位置(下一个h.r.v.) 在一个h.r.v.中滚动后,根据触摸的h.r.v.中出现的少量滚动运动重新计算其他h.r.v.的位置

然后在适配器中覆盖ViewAttachedTowindow的
,并使用特别是h.r.v的
LinearLayoutManager的
scrollToPositionWithOffset
方法将其设置到正确位置

另外,在计算移动dx时,当手指向下时,不要忘记禁用
onScrolled
方法,以避免对同一事件进行多次处理。

(由谷歌制作)允许您使用
RecyclerView
和a来制作类似的东西。自2017年6月28日起,您可以水平拖动它

对于您的示例,请如下使用:

    FlexboxLayoutManager layoutManager = new FlexboxLayoutManager(getActivity());
    layoutManager.setFlexDirection(FlexDirection.ROW);
    layoutManager.setFlexWrap(FlexWrap.WRAP);
    recyclerView.setLayoutManager(layoutManager);
不要忘记将
RecyclerView
的宽度设置为大于屏幕大小的数字,为了滚动,不要使用
match\u parent

<android.support.v7.widget.RecyclerView
        android:layout_width="3600dp"
        android:layout_height="match_parent"/>


注意:视图持有者
是按行而不是按列回收的,因此如果在很长的
回收视图
上有太重的项目,请小心,您需要在水平行中添加文本视图。文本视图的长度取决于程序的持续时间。我在Github上主持了一个示例项目。请随意添加克隆。

这里不应该使用交错的GridLayoutManager吗?@pskink您可能是对的,因为使用
LinearLayoutManager
不是最终决定:)但即使我使用交错视图,那么在滚动其中一个视图时,如何将所有的RecyclerViews一起滚动?使用SGLM,您只有一个视图RV@pskink我选择穆的原因是什么多个RV是因为每个RV代表一个通道,每个通道可能有多个程序。你不认为将所有程序交错放在一起会混淆所有程序吗?SGLM是一个网格,所以它的2D生物:这就是你想要的,不是吗?"一种布局管理器,以交错网格形式布局子级。它支持水平和垂直布局以及反向布局子级的功能。交错网格可能在布局的边缘有间隙。为避免这些间隙,交错网格布局管理器可以独立偏移跨距或在跨距之间移动项目。您可以通过setGapStrategy(int)控制此行为。"请详细说明您的答案,请参阅:@agold,感谢您的反馈,我试图在此编辑中进行解释。很好的努力,但您似乎没有通过使用ListView/RecyclerView来利用视图回收。此实现在处理和内存方面相当昂贵。在我的实现中,我希望保留此功能,但这将是一个巨大的挑战无法显示数千个程序。@waqaslam,您可以使用FixedGridLayoutManager。以下是指向它的链接: