当前位置: 首页 > 知识库问答 >
问题:

在android的nestedscrollview中使用3个recyclerviews时,滚动并不顺畅

危钱明
2023-03-14

我在一个布局文件中有三个回收器视图,它们具有水平对齐的layoutmanager,这些回收器视图在nestedscrollview中,我也将三个回收器视图中的每一个的nestedscroll设置为false。

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout 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:id="@+id/frameLayout"
    android:background="@drawable/background">

    <android.support.v4.widget.NestedScrollView
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <LinearLayout
            android:id="@+id/linearLayout"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:orientation="vertical">

            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_margin="10dp"
                android:orientation="vertical">

                    <TextView
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:layout_marginBottom="5dp"
                        android:text="FREE MOVIES"
                        android:textStyle="bold"
                        android:textSize="18sp"
                        android:textColor="@color/colorAccent"
                         />
                    <view
                        android:id="@+id/recycler_view"
                        class="android.support.v7.widget.RecyclerView"
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        android:layout_centerInParent="true" />
            </LinearLayout>

            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_margin="10dp"
                android:orientation="vertical">

                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_marginBottom="5dp"
                    android:text="PREMIUM MOVIES"
                    android:textColor="@color/colorAccent"
                    android:textStyle="bold"
                    android:textSize="18sp" />

                <view
                    android:id="@+id/recycler_view1"
                    class="android.support.v7.widget.RecyclerView"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:layout_centerInParent="true" />

            </LinearLayout>


            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_margin="10dp"
                android:orientation="vertical">

                <TextView
                    android:id="@+id/tvTrending"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_marginBottom="5dp"
                    android:text="PACKAGES"
                    android:textColor="@color/colorAccent"
                    android:textStyle="bold"
                    android:textSize="18sp" />

                <view
                    android:id="@+id/recycler_view2"
                    class="android.support.v7.widget.RecyclerView"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:layout_centerInParent="true"
                    android:dividerHeight="10.0sp" />
            </LinearLayout>

        </LinearLayout>

    </android.support.v4.widget.NestedScrollView>

    <ProgressBar
        android:id="@+id/progress"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:visibility="gone"
        android:layout_gravity="center"/>

</FrameLayout>

这是一个片段的布局,我从MainActivity的一个视图寻呼机中调用了它。它的布局是这样的

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:ads="http://schemas.android.com/apk/res-auto"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.newitventure.musicnepal.MainActivity">

    <android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:id="@+id/coordinatorLayout"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <android.support.design.widget.AppBarLayout
            android:id="@+id/tabanim_appbar"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar">


            <include
                android:id="@+id/tool_bar"
                layout="@layout/toolbar" />

            <android.support.design.widget.TabLayout
                android:id="@+id/tabLayout"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                app:tabMaxWidth="0dp"
                android:background="@color/colorPrimaryDark"
                app:tabGravity="fill"
                app:tabTextAppearance="@style/MyCustomTextAppearance"
                app:tabMode="scrollable" />

        </android.support.design.widget.AppBarLayout>

        <android.support.v4.view.ViewPager
            android:id="@+id/tabanim_viewpager"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_marginBottom="50dp"
            app:layout_behavior="@string/appbar_scrolling_view_behavior" />


    </android.support.design.widget.CoordinatorLayout>

    <LinearLayout
        android:id="@+id/gad_bottom"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_gravity="bottom"
        android:orientation="horizontal"
        android:visibility="visible">

    </LinearLayout>
</RelativeLayout>

问题是,当试图在此布局中滚动时,滚动并不顺畅。在尝试垂直和水平滚动时,它会变得非常滞后。这里可能有什么问题?

共有2个答案

咸琪
2023-03-14

好吧,

我从给出的代码中看到了三种可能性

1)您在视图的根目录下使用了RelativeLayout。虽然RelativeLayout非常棒,但它确实有其缺点。由于RelativeLayout是如何构建的,它会两次测量自己和其中的所有子节点。因此,对于当前显示的每一帧,Android需要重新计算每个视图两次。

2) 你的视图确实有一个“相当”的深层结构,我认为你可以去掉TextView和recycleview对周围的3个线性布局中的每一个。

3)显示回收器视图时,您正在bindView方法中做一些繁重的事情。

现在,这三个因素都很重要,并在使其滞后方面发挥了作用。我可能会从2开始(我不认为单凭这一点就能完全解决问题,但它应该会提高代码的可读性和速度),然后我会检查3(如果你为适配器粘贴代码,如果有明确的地方,我可以查看一下)。如果这仍然没有帮助,请尝试1(这可能很难,因为RelativeLayout非常适合构造代码)

希望有帮助!

司徒锐进
2023-03-14

这解决了我的问题:

mRecyclerView.setNestedScrollingEnable(false);

详情如下:

Recyclerview内部滚动视图滚动不顺畅

 类似资料:
  • 我有一个简单的折叠工具栏布局xml,如下所示: 一切都很好,直到我尝试从底部快速滚动到顶部(从嵌套滚动视图内容到CollapsingToolbarLayout),并且嵌套内容覆盖图像,这太可怕了。我一直在尝试我找到的所有选项,但似乎没有任何效果。 我的所有库都根据文档进行了更新,基本代码来自一些基本示例,这些示例似乎对每个人都适用。 有人能帮我解决这个问题吗? 我提供了一些图片来更好地解释问题:

  • 我有底部的导航栏和视窗内的协调器布局,视窗内的每个片段都有自己的折叠工具栏, 但是对我不起作用。 我也不想做通过监听我嵌套的滚动视图(内部片段),因为它没有动画。 我的活动 其中一个片段(在内容视图中有一个嵌套的scrollview。我设置了它的布局行为) 这些链接不起作用在滚动上隐藏/显示底部导航视图 使用AppBarLayout在协调布局中滚动时显示/隐藏底部导航视图 当滚动底部导航栏不隐藏时

  • 当我试图滚动它触摸AppBarLayout部分时,滚动折叠AppBar有问题。而且有时滚动不流畅。 这是一个短视频(1米30秒)的问题:https://www.youtube.com/watch?v=n32N9Z4S3SA 这是指向简单项目的链接(仅在 github 上出现此问题):https://github.com/yozhik/Reviews/tree/master/app/src/main

  • 我的应用程序围绕一个HomeActivity,它在底部包含4个选项卡。这些选项卡中的每一个都是一个片段,所有的选项卡从一开始就被添加(而不是替换),并且在点击相应的选项卡时被隐藏/显示。 我的问题是,每当我更改tab时,我的卷轴的状态就会丢失。显示该问题的每个片段都使用(参见下面的示例)。 注意:由于某种原因,我的使用RecyclerView或ListView的片段保持了它们的滚动状态。 我读了几