Android6.0 ScrollView与RecyclerView滑动冲突的问题
Posted 魏军强
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android6.0 ScrollView与RecyclerView滑动冲突的问题相关的知识,希望对你有一定的参考价值。
前记:我有个这样的需求,在一个LinearLayout中Vertical展示俩个不同的recycleview,但是要求俩个recycleview都全部展示出来;
在android5.0的系统中,我的做法是,只要在LinearLayout外面加一个ScrollView我的问题就解决了。在Android5.0的机器上运行,效果确实是我要的。代码如下:
<ScrollView
android:id="@+id/sv_search_result"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginTop="@dimen/size_10"
android:scrollbars="none">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<com.hp.appquestion.view.CustomRecyclerView
android:id="@+id/rv_video_list"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<com.hp.appquestion.view.CustomRecyclerView
android:id="@+id/rv_exam_list"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</LinearLayout>
</ScrollView>
但这段代码放到Android6.0系统的机器上面跑,我发现第二个RecyclerView的内容没有铺开展示,第二个RecyclerView可以滑动。而且发现还有个问题,即使ScrollView中只放一个RecyclerView,全部铺开展示,滑动起来的时候有明显的卡顿感。
网上查了资料,说在Android6.0系统中,如果RecyclerView与RecyclerView一起使用,确实存在俩者滑动冲突的问题。滑动冲突需要自己想办法解决。
结合网上的资料,我自己的解决办法是。
1,先解决第一个recyclerview都能完整显示的问题
在俩个recyclerview外面都包裹一个相对布局RelativeLayout,一定是俩个recyclerview都要包裹。我试着只包裹下底部的一个,发现当底部的数据增多时,会出现异常。
代码如下:
<ScrollView
android:id="@+id/sv_search_result"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginTop="@dimen/size_10"
android:scrollbars="none">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<com.hp.appquestion.view.CustomRecyclerView
android:id="@+id/rv_video_list"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</RelativeLayout>
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<com.hp.appquestion.view.CustomRecyclerView
android:id="@+id/rv_exam_list"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</RelativeLayout>
</LinearLayout>
</ScrollView>
上面就解决了Android6.0上俩个recyclerview都能完整显示的问题
2,解决滑动recyclerView时有卡顿的问题
原因还是滑动冲突的问题,我的解决方案是,重写LinearLayoutManager,设置让其不可滑动,外部滑动靠ScrollView,这样就解决了滑动时卡顿的问题
代码如下:
public class ScrollLinearLayoutManager extends LinearLayoutManager
private boolean isScrollEnabled = true;
public ScrollLinearLayoutManager(Context context)
super(context);
public ScrollLinearLayoutManager(Context context, int orientation, boolean reverseLayout)
super(context, orientation, reverseLayout);
public ScrollLinearLayoutManager(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes)
super(context, attrs, defStyleAttr, defStyleRes);
public void setScrollEnabled(boolean flag)
this.isScrollEnabled = flag;
@Override
public boolean canScrollVertically()
return isScrollEnabled && super.canScrollVertically();
使用:
ScrollLinearLayoutManager scrollLinearLayoutManager = new ScrollLinearLayoutManager(this);
scrollLinearLayoutManager.setScrollEnabled(false);
mRecyclerView.setLayoutManager(scrollLinearLayoutManager);
这样,俩个问题就都解决了!
以上是关于Android6.0 ScrollView与RecyclerView滑动冲突的问题的主要内容,如果未能解决你的问题,请参考以下文章
解决ScrollView嵌套RecyclerView出现item显示不全的问题
android6.0源码分析之Camera API1.0框架简介