实现两个RecyclerView联动(左侧固定一栏,右侧可左右滑
最近开发遇到的一个需求。展示篮球队员的各种数据,左侧一栏是球员的名字。右边是各种各样的数据,包括赛季三分球,篮板,抢断,得分,失误。然后三分球二分球罚篮命中率等。有七八项之多。我心想这啥需求啊。左边固定,右边还可以滑动。然后滑动右侧或者左侧,另外的要跟着动,毕竟是球员与球员数据对应。WTF。
{_~6X`YGI44LJCFT(}AE(J2.png
可能大家一看也跟我一样。觉得很复杂,一个跟着一个动,流畅性怎么样。然后右边的左右滑动又该如何实现呢。
别着急,我已经帮大家踩好了坑。虽然大多数开发中很少有这样的页面展示需求。这里记录下,希望有同样需求的有所帮助。毕竟我当时百度是没有百度到这种需求的。
一、写左右两个RecyclerView
左侧recyclerView的Item布局就是一个TextView展示球员名字。右侧的recyclerView的item。因为比较长。所以,每一个item必须指定宽度dp。比如每个50dp、用权重的话整个item会被压缩在屏幕里。而无法左右滑动。这个比较好理解。
二、将第二个RecyclerView包在HorizontalScrollView中。
将RecyclerView包在HorizontalScrollView中。这样就可以左右滑动了。贴下布局代码
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:paddingBottom="10dp"
>
<LinearLayout
android:layout_width="80dp"
android:layout_height="wrap_content">
<android.support.v7.widget.RecyclerView
android:id="@+id/foot_info_water_left_recycler"
android:layout_width="match_parent"
android:layout_height="match_parent"
/>
</LinearLayout>
<HorizontalScrollView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:scrollbars="none" //去掉滚动条
>
<android.support.v7.widget.RecyclerView
android:id="@+id/foot_info_water_right_recycler"
android:layout_width="match_parent"
android:layout_height="wrap_content"
/>
</HorizontalScrollView>
</LinearLayout>
三、让左右RecyclerView进行联动
我们发现现在滑动我们的recyclerView是左右两侧并没有跟着滑动的。有的同学可能想分别监听左右两侧的滑动距离。然后再动态设置给左右两侧。这样也不是不可以。之前做别的需求的时候,那时候还是用listview,尝试过。滑动的时候超级不流畅。已经到了卡顿的地步。
其实想让左右两侧跟着动超级简单。用NestedScrollView(V4包系统自带)包一下上面的布局,就可以了。就这么简单。
四、最后的优化
进行完上面的步骤我们的左右两侧已经跟着滑动了。但是会超级不流畅。一划只能滑动几个item。没有filing。这是因为我们的recyclerview跟nestedScrollView都进行了滑动计算。那么让recycle人View不进行滑动计算。让滑动全有scrollView来接受。就会变得流畅了。代码里设置
mRightRecyclerView.setNestedScrollingEnabled(false);
如果我们的布局最外层是SwipeRefreshLayout的话。会跟ScrollView有冲突。进行一下Scroll是否滑动到顶部的判断即可。
mScrollView.setOnScrollChangeListener(new NestedScrollView.OnScrollChangeListener() {
@Override
public void onScrollChange(NestedScrollView v, int scrollX, int scrollY, int oldScrollX, int oldScrollY) {
if(mScrollView.getScrollY()==0){
mRefreshLayout.setEnabled(true);
}else {
mRefreshLayout.setEnabled(false);
}
}
});
总结
总的来说,还是RecycleView强大。暴露出的超级多的方法。可以高度定制。 有兴趣的可以看下源码。之前在 泡在网上的日子 看的源码解析还不错。
大家可以关注下我的微信公众号。dongyun_android
以后有了新的内容会分享给大家。一起提高。
扫码关注。
image.png