一起滚动多个水平RecyclerView

问题描述 投票:9回答:4

我正在创建一个EPG视图,我有多个水平RecyclerViews(作为电视节目)封装在LinearLayout中。当我滚动其中一个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方法感到困惑,因为我无法弄清楚如何滚动其他视图。

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

TV Channels' view

android scroll android-recyclerview epg
4个回答
3
投票

Horizo​​ntalScrollView

{

线性布局

{

水平回收站视图的垂直列表,覆盖水平回收站视图的LayoutManager canScroolhorizo​​ntally()方法返回false,以便它们根据Grand Parent ScrollView一起滚动。

}

我们的主要焦点是水平滚动水平回收者视图的垂直列表,首先我试图将它们全部保持在水平滚动视图上,但这是android系统明确拒绝的东西,所以我保留了一个线性布局(在我的案例垂直取向)作为调解人。

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


1
投票

您需要始终在水平回收器视图中重新计算当前项目的位置(下一个h.r.v.)滚动到一个h.r.v.基于触摸的h.r.v中发生的少量滚动运动重新计算其他人的位置。

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

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


1
投票

FlexboxLayout(由谷歌制作)让你用RecyclerViewFlexboxLayoutManager制作这样的东西。自version 3.0(2017年6月28日)起,您可以水平拖动它。

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

    FlexboxLayoutManager layoutManager = new FlexboxLayoutManager(getActivity());
    layoutManager.setFlexDirection(FlexDirection.ROW);
    layoutManager.setFlexWrap(FlexWrap.WRAP);
    recyclerView.setLayoutManager(layoutManager);

并且不要忘记将RecyclerView的宽度设置为比屏幕大小更大的数字,为了滚动,请不要使用match_parent

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

注意:ViewHolders是按行而不是按列回收的,所以如果你在很长的RecyclerView上有太重的物品要小心


0
投票

您需要在水平行中添加textviews。 textview的长度取决于程序的持续时间。我在Github上主持了一个示例项目。随意克隆。 https://github.com/xardox69/android_EPG

© www.soinside.com 2019 - 2024. All rights reserved.