9

我正在创建一个类似 EPG 的视图,我RecyclerView在 LinearLayout 中封装了多个水平 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's onScrolled方法感到困惑,因为我不知道如何滚动其他视图。

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

电视频道的观点

4

4 回答 4

3

Horizo​​ntelScrollView

{

线性布局

{

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

}

我们的主要重点是水平滚动水平回收器视图的垂直列表,首先我尝试将所有这些视图保持在水平滚动视图上,但这是 android 系统明确拒绝的东西,所以我保留了一个线性布局(在我的案例垂直方向)作为中介。

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

于 2015-10-23T13:39:09.297 回答
1

您需要始终重新计算水平回收器视图中当前项目的位置(下一个 hrv) 在滚动一个 hrv 后,根据触摸 hrv 中发生的少量滚动移动重新计算其他项目的位置

然后onViewAttachedToWindow在适配器中覆盖并使用特别是hrv的方法scrollToPositionWithOffsetLinearLayoutManager其设置为正确的位置。

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

于 2015-11-17T11:33:18.337 回答
0

FlexboxLayout(由 Google 制作)让您可以使用 aRecyclerView和 a制作类似的东西FlexboxLayoutManager。从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

于 2017-12-18T17:49:06.140 回答
0

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

于 2018-05-28T09:45:37.597 回答