ScrollView中的Recyclerview滚动不顺畅



对于我的应用程序,我在ScrollView中使用RecyclerView,其中RecyclerView具有基于其使用此库的内容的高度。滚动正在工作,但当我在RecyclerView上滚动时,它工作不顺利。当我滚动到ScrollView本身时,它会平滑地滚动。

我用来定义RecyclerView的代码:

LinearLayoutManager friendsLayoutManager = new LinearLayoutManager(getActivity().getApplicationContext(), android.support.v7.widget.LinearLayoutManager.VERTICAL, false);
mFriendsListView.setLayoutManager(friendsLayoutManager);
mFriendsListView.addItemDecoration(new DividerItemDecoration(getActivity().getApplicationContext(), null));

ScrollView中的RecyclerView:

<android.support.v7.widget.RecyclerView
    android:layout_marginTop="10dp"
    android:layout_marginBottom="10dp"
    android:id="@+id/friendsList"
    android:layout_width="match_parent"
    android:layout_height="wrap_content" />

试着做:

RecyclerView v = (RecyclerView) findViewById(...);
v.setNestedScrollingEnabled(false);
作为一种选择,您可以使用支持设计库修改您的布局。我猜你当前的布局应该是这样的:
<ScrollView >
   <LinearLayout >
       <View > <!-- upper content -->
       <RecyclerView > <!-- with custom layoutmanager -->
   </LinearLayout >
</ScrollView >

可以修改为:

<CoordinatorLayout >
    <AppBarLayout >
        <CollapsingToolbarLayout >
             <!-- with your content, and layout_scrollFlags="scroll" -->
        </CollapsingToolbarLayout >
    </AppBarLayout >
    <RecyclerView > <!-- with standard layoutManager -->
</CoordinatorLayout >

然而,这是一条更长的路要走,如果你对自定义线性布局管理器满意,那么就在回收器视图上禁用嵌套滚动。

编辑(4/3/2016)

v 23.2版本的支持库现在在所有默认的LayoutManager中都包含了一个工厂"包装内容"特性。我没有测试它,但是你应该更喜欢它而不是你正在使用的库。

<ScrollView >
   <LinearLayout >
       <View > <!-- upper content -->
       <RecyclerView > <!-- with wrap_content -->
   </LinearLayout >
</ScrollView >

我只需要使用这个:

mMyRecyclerView.setNestedScrollingEnabled(false);

在我的onCreateView()方法

非常感谢!

您可以这样使用:

将这行添加到您的recyclerView xml文件中:

android:nestedScrollingEnabled="false"

或者在java代码中:

RecyclerView.setNestedScrollingEnabled(false);

您可以使用XML和编程方式尝试这两种方法。但是您可能面临的问题是(在API 21下面),用XML做这件事是行不通的。所以最好在你的Activity/Fragment中以编程方式设置它。

XML代码:

<android.support.v7.widget.RecyclerView
      android:id="@+id/recycleView"
      android:layout_width="match_parent"
      android:visibility="gone"
      android:nestedScrollingEnabled="false"
      android:layout_height="wrap_content"
      android:layout_below="@+id/linearLayoutBottomText" /> 
以编程方式

:

 recycleView = (RecyclerView) findViewById(R.id.recycleView);
 recycleView.setNestedScrollingEnabled(false);

使用嵌套滚动视图代替滚动视图解决了我的问题

<LinearLayout> <!--Main Layout -->
   <android.support.v4.widget.NestedScrollView>
     <LinearLayout > <!--Nested Scoll View enclosing Layout -->`
       <View > <!-- upper content --> 
       <RecyclerView >

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

我有类似的问题(我试图创建一个嵌套的RecyclerViews类似Google PlayStore设计)。处理这个问题的最好方法是通过子类化子RecyclerViews并重写'onInterceptTouchEvent'和'onTouchEvent'方法。通过这种方式,您可以完全控制这些事件的行为并最终滚动。

用NestedScrollView替换ScrollView可以平滑地滚动到底部。

这里的答案都是一样的。我已经用了所有人的建议。然后我发现NestedScrollView比ScrollView快,所以

使用

<androidx.core.widget.NestedScrollView
不是

<ScrollView

和平常一样用

recycleView.setNestedScrollingEnabled(false);

所有答案总结(优势&缺点)

For single recycleview

可以在Coordinator布局中使用。

优点 -它不会加载整个recycleview项。加载很顺利。

缺点 -你不能在协调器布局中加载两个recyclerview -它会产生滚动问题

参考- https://stackoverflow.com/a/33143512/3879847

For multiple recylerview with minimum rows

可以在NestedScrollView内加载

优势 -滚动会很顺畅

缺点 -它加载recyclerview的所有行,所以您的活动打开延迟

参考- https://stackoverflow.com/a/33143512/3879847

你必须使用recyclerview

优势 -滚动顺畅,加载顺畅

缺点 -你需要写更多的代码和逻辑

在multiviewhoders的帮助下在主recyclerview中加载每个recylerview

,

MainRecyclerview

-ChildRecyclerview1 (ViewHolder1)
-ChildRecyclerview2 (ViewHolder2)
-ChildRecyclerview3 (ViewHolder3) 
-Any other layout   (ViewHolder4)

multi-viewHolder - https://stackoverflow.com/a/26245463/3879847参考

Kotlin

为滚动视图下的每个RecyclerView设置isNestedScrollingEnabledfalse

val recyclerView = findViewById<RecyclerView>(R.id.recyclerView)
recyclerView.isNestedScrollingEnabled = false

使用XML布局

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

如果你在你的子视图中使用VideoView或重物小部件,保持你的RecyclerView高度为wrap_content在高度为match_parent的NestedScrollView中然后滚动就会像你想要的那样平滑。

通知你,

<android.support.v4.widget.NestedScrollView
        android:layout_width="match_parent"
        android:layout_height="match_parent">
        <android.support.v7.widget.RecyclerView
            android:layout_width="match_parent"
            android:nestedScrollingEnabled="false"
            android:layout_height="wrap_content"
            android:clipToPadding="false" />
</android.support.v4.widget.NestedScrollView>

谢谢微这是从你的提示!

karthik

你可以使用ScrollView作为父视图,而NestedScrollView作为子视图。这样的:-

       <androidx.core.widget.NestedScrollView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/CL1">
        <androidx.recyclerview.widget.RecyclerView
            android:id="@+id/eventRV"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toBottomOf="@+id/CL1" />
    </androidx.core.widget.NestedScrollView>
XML代码:
<android.support.v4.widget.NestedScrollView
            android:layout_width="match_parent"
            android:layout_height="match_parent">
            <android.support.v7.widget.RecyclerView
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:clipToPadding="false" />
        </android.support.v4.widget.NestedScrollView>

  recycleView = (RecyclerView) findViewById(R.id.recycleView);
     recycleView.setNestedScrollingEnabled(false);

或者您可以在回收器视图中设置android:focusableInTouchMode="true"

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    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">
    <android.support.v4.widget.NestedScrollView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent">
        <android.support.constraint.ConstraintLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintRight_toRightOf="parent">
            <android.support.constraint.ConstraintLayout
                android:id="@+id/constraintlayout_main"
                android:layout_width="match_parent"
                android:layout_height="@dimen/layout_width_height_fortyfive"
                android:layout_marginLeft="@dimen/padding_margin_sixteen"
                android:layout_marginRight="@dimen/padding_margin_sixteen"
                app:layout_constraintLeft_toLeftOf="parent"
                app:layout_constraintRight_toRightOf="parent">
                <TextView
                    android:id="@+id/textview_settings"
                    style="@style/textviewHeaderMain"
                    android:gravity="start"
                    android:text="@string/app_name"
                    app:layout_constraintLeft_toLeftOf="parent"
                    app:layout_constraintRight_toRightOf="parent" />
            </android.support.constraint.ConstraintLayout>
            <android.support.constraint.ConstraintLayout
                android:id="@+id/constraintlayout_recyclerview"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginStart="@dimen/padding_margin_zero"
                android:layout_marginTop="@dimen/padding_margin_zero"
                android:layout_marginEnd="@dimen/padding_margin_zero"
                app:layout_constraintLeft_toLeftOf="parent"
                app:layout_constraintRight_toRightOf="parent"
                app:layout_constraintTop_toBottomOf="@+id/constraintlayout_main">
                <android.support.v7.widget.RecyclerView
                    android:id="@+id/recyclerview_list"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:nestedScrollingEnabled="false"
                    app:layout_constraintLeft_toLeftOf="parent"
                    app:layout_constraintRight_toRightOf="parent" />
            </android.support.constraint.ConstraintLayout>
        </android.support.constraint.ConstraintLayout>
    </android.support.v4.widget.NestedScrollView>
</android.support.constraint.ConstraintLayout>

这段代码是在ConstraintLayout android

简单添加这行到你的JAVA类

list.setNestedScrollingEnabled(false);

我自己就有这个问题,在滚动视图中有一个回收器视图,滚动似乎不光滑。我的问题的原因是在回收器视图的顶部有滚动视图,这是不需要我的要求。因此,在我删除滚动视图并添加android:scrollbars="vertical"用于回收视图后,滚动是平滑的。

经过3天的研究,我解决了项目中的平滑滚动问题。

问题是<layer-list>可绘制设置在item_user.xml文件的背景,所以它需要GPU时间来渲染,这就是为什么滚动不光滑。因此,请不要在适配器项目的背景中使用复杂的<layer-list>绘制。

我的问题已经用上面的方法解决了,下面的选项对我没用

  1. setNestedScrollingEnabled
  2. setHasFixedSize
  3. setItemViewCacheSize

相关内容

  • 没有找到相关文章

最新更新