一起滚动多个水平RecyclerView
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一起滚动多个水平RecyclerView相关的知识,希望对你有一定的参考价值。
我正在创建一个EPG视图,我有多个水平RecyclerView
s(作为电视节目)封装在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方法感到困惑,因为我无法弄清楚如何滚动其他视图。
任何帮助/建议都会有所帮助。
HorizontalScrollView
{
线性布局
{
水平回收站视图的垂直列表,覆盖水平回收站视图的LayoutManager canScroolhorizontally()方法返回false,以便它们根据Grand Parent ScrollView一起滚动。
}
我们的主要焦点是水平滚动水平回收者视图的垂直列表,首先我试图将它们全部保持在水平滚动视图上,但这是android系统明确拒绝的东西,所以我保留了一个线性布局(在我的案例垂直取向)作为调解人。
因此,由于水平滚动视图,epg网格现在可以垂直滚动,因为它们在一个垂直回收器视图内以及水平滚动。我们不应该允许水平列表独立滚动,所以我扩展了layoutmanager并禁止水平滚动,现在它们只在grandParent滚动下滚动。
您需要始终在水平回收器视图中重新计算当前项目的位置(下一个h.r.v.)滚动到一个h.r.v.基于触摸的h.r.v中发生的少量滚动运动重新计算其他人的位置。
然后在适配器中覆盖onViewAttachedToWindow
并使用特别是h.r.v的scrollToPositionWithOffset
中的方法LinearLayoutManager
将其设置为正确的位置。
此外,在计算移动dx时,不要忘记在手指向下时禁用onScrolled
方法以避免多次处理同一事件。
FlexboxLayout
(由谷歌制作)让你用RecyclerView
和FlexboxLayoutManager
制作这样的东西。自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
上有太重的物品要小心
您需要在水平行中添加textviews。 textview的长度取决于程序的持续时间。我在Github上主持了一个示例项目。随意克隆。 https://github.com/xardox69/android_EPG
以上是关于一起滚动多个水平RecyclerView的主要内容,如果未能解决你的问题,请参考以下文章
将水平 RecyclerView 作为项目放置在垂直 RecyclerView 中时的自动滚动问题