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系统添加那些新特性

Android6.0+需要手动添加得权限说明

android6.0源码分析之Camera API1.0框架简介

android6.0源码分析之Camera API2.0下的video流程分析

android6.0源码分析之Camera API2.0下的video流程分析