美文网首页Android开发Android 开发技术分享Android技术知识
关于ScrollView嵌套多个RecyclerView滑动冲突

关于ScrollView嵌套多个RecyclerView滑动冲突

作者: zgsHighwin | 来源:发表于2017-09-30 18:02 被阅读697次
  • Android的滑动冲突可以说是老生常谈了,在项目中会遇到各种各样的滑动冲突问题,本遍文章主要对在ScrollView中多个RecyclerView的滑动冲突的处理,当然会有一部分使用第三部分上下拉刷新加载(SmartRefreshLayout,TwinklingRefreshLayout)的冲突的处理方式。(本次例子使用的是SmartRefreshLayout)

当ScrollIView内部只有一个RecyclerView的时候

<?xml version="1.0" encoding="utf-8"?>
<ScrollView
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/scroll_view"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    >
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">
        <!--其它的View-->
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content">

            <TextView
                android:id="@+id/header_view"
                android:layout_width="match_parent"
                android:layout_height="80dp"
                android:gravity="center"
                android:text="这个是RecyclerView"
                android:textColor="#000"
                android:textSize="24sp"/>
        </LinearLayout>

        <android.support.v7.widget.RecyclerView
            android:id="@+id/recycler_view"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            />
    </LinearLayout>
</ScrollView>

OneRecyclerView.gif

当ScrollIView内部有多个RecyclerView的时候

<?xml version="1.0" encoding="utf-8"?>
<ScrollView
    android:id="@+id/scroll_view"
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    >

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">

        <!--其它的View-->
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content">

            <TextView
                android:id="@+id/header_view"
                android:layout_width="match_parent"
                android:layout_height="80dp"
                android:gravity="center"
                android:text="这个是RecyclerView"
                android:textColor="#000"
                android:textSize="24sp"/>

        </LinearLayout>


        <RelativeLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:descendantFocusability="blocksDescendants"
            android:focusable="true"
            android:focusableInTouchMode="true">

            <android.support.v7.widget.RecyclerView
                android:id="@+id/recycler_view_one"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:nestedScrollingEnabled="false"
                >

            </android.support.v7.widget.RecyclerView>
        </RelativeLayout>

        <RelativeLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:descendantFocusability="blocksDescendants"
            android:focusable="true"
            android:focusableInTouchMode="true">

            <android.support.v7.widget.RecyclerView
                android:id="@+id/recycler_view_two"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:layout_marginBottom="30dp"
                android:layout_marginTop="30dp"
                android:nestedScrollingEnabled="false">


            </android.support.v7.widget.RecyclerView>
        </RelativeLayout>

        <RelativeLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:descendantFocusability="blocksDescendants"
            android:focusable="true"
            android:focusableInTouchMode="true">

            <android.support.v7.widget.RecyclerView
                android:id="@+id/recycler_view_three"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:nestedScrollingEnabled="false">


            </android.support.v7.widget.RecyclerView>
        </RelativeLayout>
    </LinearLayout>
</ScrollView>

当ScrollView嵌套多个RecyclerView时设置RecyclerView的android:nestedScrollingEnabled="false",将滑动事件交给父类的ScrollView去处理,并且每个RecyclerView外面包上一层RelativeLayout,设置如下属性,效果展示出下:

            android:descendantFocusability="blocksDescendants"
            android:focusable="true"
            android:focusableInTouchMode="true"
MultiRecyclerView.gif

当ScrollIView内部只有一个RecyclerView的时候并且外部嵌套上下拉刷新控件

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
                xmlns:app="http://schemas.android.com/apk/res-auto"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:orientation="vertical">


    <com.scwang.smartrefresh.layout.SmartRefreshLayout
        android:id="@+id/smart_refresh_layout"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:srlEnableHeaderTranslationContent="false"
        app:srlEnableLoadmore="true"
        >

        <com.scwang.smartrefresh.header.MaterialHeader
            android:id="@+id/header"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"/>

        <ScrollView
            android:id="@+id/scroll_view"
            android:layout_width="match_parent"
            android:layout_height="match_parent">

            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:orientation="vertical">

                <!--其它的View-->
                <LinearLayout
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content">

                    <TextView
                        android:id="@+id/header_view"
                        android:layout_width="match_parent"
                        android:layout_height="80dp"
                        android:gravity="center"
                        android:text="这个是RecyclerView"
                        android:textColor="#000"
                        android:textSize="24sp"/>

                </LinearLayout>

                <RelativeLayout
                    android:layout_width="match_parent"
                    android:layout_height="match_parent"
                    android:descendantFocusability="blocksDescendants"
                    android:focusable="true"
                    android:focusableInTouchMode="true">

                    <android.support.v7.widget.RecyclerView
                        android:id="@+id/recycler_view"
                        android:layout_width="match_parent"
                        android:layout_height="match_parent"
                        android:nestedScrollingEnabled="false"
                        >

                    </android.support.v7.widget.RecyclerView>
                </RelativeLayout>
            </LinearLayout>
        </ScrollView>

        <com.scwang.smartrefresh.layout.footer.ClassicsFooter
            android:layout_width="match_parent"
            android:layout_height="wrap_content"/>
    </com.scwang.smartrefresh.layout.SmartRefreshLayout>

</RelativeLayout>

OneRecyclerViewWithRefresh.gif

当ScrollIView内部有多个RecyclerView的时候并且外部嵌套上下拉刷新控件

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
                xmlns:app="http://schemas.android.com/apk/res-auto"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:orientation="vertical">


    <com.scwang.smartrefresh.layout.SmartRefreshLayout
        android:id="@+id/smart_refresh_layout"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:srlEnableHeaderTranslationContent="false"
        app:srlEnableLoadmore="true"
        >

        <com.scwang.smartrefresh.header.MaterialHeader
            android:id="@+id/header"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"/>

        <ScrollView
            xmlns:android="http://schemas.android.com/apk/res/android"
            android:id="@+id/scroll_view"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            >

            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:orientation="vertical">

                <!--其它的View-->
                <LinearLayout
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content">

                    <TextView
                        android:id="@+id/header_view"
                        android:layout_width="match_parent"
                        android:layout_height="80dp"
                        android:gravity="center"
                        android:text="这个是RecyclerView"
                        android:textColor="#000"
                        android:textSize="24sp"/>

                </LinearLayout>

                <RelativeLayout
                    android:layout_width="match_parent"
                    android:layout_height="match_parent"
                    android:descendantFocusability="blocksDescendants"
                    android:focusable="true"
                    android:focusableInTouchMode="true">

                    <android.support.v7.widget.RecyclerView
                        android:id="@+id/recycler_view_one"
                        android:layout_width="match_parent"
                        android:layout_height="match_parent"
                        android:nestedScrollingEnabled="false"
                        >

                    </android.support.v7.widget.RecyclerView>
                </RelativeLayout>

                <RelativeLayout
                    android:layout_width="match_parent"
                    android:layout_height="match_parent"
                    android:descendantFocusability="blocksDescendants"
                    android:focusable="true"
                    android:focusableInTouchMode="true">

                    <android.support.v7.widget.RecyclerView
                        android:id="@+id/recycler_view_two"
                        android:layout_width="match_parent"
                        android:layout_height="match_parent"
                        android:layout_marginBottom="30dp"
                        android:layout_marginTop="30dp"
                        android:nestedScrollingEnabled="false">


                    </android.support.v7.widget.RecyclerView>
                </RelativeLayout>

                <RelativeLayout
                    android:layout_width="match_parent"
                    android:layout_height="match_parent"
                    android:descendantFocusability="blocksDescendants"
                    android:focusable="true"
                    android:focusableInTouchMode="true">

                    <android.support.v7.widget.RecyclerView
                        android:id="@+id/recycler_view_three"
                        android:layout_width="match_parent"
                        android:layout_height="match_parent"
                        android:nestedScrollingEnabled="false">


                    </android.support.v7.widget.RecyclerView>
                </RelativeLayout>
            </LinearLayout>
        </ScrollView>

        <com.scwang.smartrefresh.layout.footer.ClassicsFooter
            android:layout_width="match_parent"
            android:layout_height="wrap_content"/>
    </com.scwang.smartrefresh.layout.SmartRefreshLayout>

</RelativeLayout>

MultiRecyclerViewWithRefresh.gif

以上为在ScrollView中嵌套RecyclerView产生的滑动冲突问题的解决方案,如有不当的地方,欢迎指正,谢谢

最后附上GitHub地址RecyclerViewInScrollView

相关文章

网友评论

    本文标题:关于ScrollView嵌套多个RecyclerView滑动冲突

    本文链接:https://www.haomeiwen.com/subject/tdytextx.html