在 ScrollView 中回收视图不能顺利滚动

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);
所有默认 LayoutManager的特性。我没有测试它,但是您可能更喜欢它,而不是您正在使用的库。

<ScrollView >
<LinearLayout >


<View > <!-- upper content -->
<RecyclerView > <!-- with wrap_content -->


</LinearLayout >
</ScrollView >
118773 次浏览

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

<ScrollView >
<LinearLayout >


<View > <!-- upper content -->
<RecyclerView > <!-- with wrap_content -->


</LinearLayout >
</ScrollView >
D 重写“ onInterceptTouchEvent”和“ onTouchEvent”方法。通过这种方式,您可以完全控制这些事件的行为并最终滚动。

我也遇到过类似的问题(我曾试图创建一个类似于 GooglePlayStore 设计的嵌套循环视图)。处理这个问题的最佳方法是子类化子循环视图并覆盖‘ onInterceptTouchEvent’和‘ onTouchEvent’方法。通过这种方式,您可以完全控制这些事件的行为并最终滚动。

Karthik

您可以尝试使用 XML 和编程两种方法。但是您可能面临的问题是(在 API 21之下)使用 XML 进行操作将不会起作用。因此,最好在活动/片段中以编程方式设置它。

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

<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>

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);

Karthik

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

<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>

在 java 代码中:

  recycleView = (RecyclerView) findViewById(R.id.recycleView);
recycleView.setNestedScrollingEnabled(false);
应用程序: lay _ constraintTop _ toBottomOf = “@+ id/straintouts _ main”>

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

< android.support. v7.widget Android: id = “@+ id/迴收视图 _ list” Android: layout _ width = “ match _ parent” Android: layout _ height = “ wrap _ content”

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

Android: nestedScrollingEnable = “ false” App: layastraintLeft _ toLeftOf = “ father” 应用程序: laysconstraintRight _ toRightOf = “ father”/>

我的问题用上面的方法解决了,下面的方法对我没有用

  1. 启用
  2. SetHasFixedSize
  3. 此代码适用于 ConstraintLayout android

<?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>
  • SetItemViewCacheSize
  • 此代码适用于 ConstraintLayout android

    所有答案的摘要(利与弊)

    右边的 = “父母”>

    就为了一个回收站

    < android.support. 約束. ConstraintLayout

    你可以在协调器布局中使用它。

    Android: layout _ width = “ match _ parent”

    优点 -它不会加载整个回收视图项目。

    Android: layout _ height = “ match _ parent”

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

    App: layastraintLeft _ toLeftOf = “ father”

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

    应用程序: outs _ constraintRight _ toRightOf = “ father”>

    对于具有最少行的多个 recylerview

    < android.support. 約束. ConstraintLayout

    您可以在 NestedScrollView 中加载

    优势 -它将平滑地滚动

    Android: id = “@+ id/straintouts _ main”

    缺点 -它加载了所有回收视图行,因此您的活动会延迟打开

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

    对于具有大行(超过100)的多个 recylerview

    Android: layout _ width = “ match _ parent” Android: lay_ height = “@dimen/lay_ width _ height _ fortyfive”

    你必须选择回收站。

    布局边缘左边 = “@dimen/填充边缘 _ 16”

    优点 -滚动平稳,加载平稳

    @ dimen/pding _ edge _ six 安卓系统:

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

    App: layastraintLeft _ toLeftOf = “ father”

    在多视点持有者的帮助下加载主回收视图中的每个回收视图

    应用程序: outs _ constraintRight _ toRightOf = “ father”>

    例如:

    < TextView

    主回收站

    -ChildRecyclerview1 (ViewHolder1)
    
    
    -ChildRecyclerview2 (ViewHolder2)
    
    
    -ChildRecyclerview3 (ViewHolder3)
    
    
    -Any other layout   (ViewHolder4)
    
    Android: id = “@+ id/textview _ sets”

    多视图持有者参考文献 -https://stackoverflow.com/a/26245463/3879847

    Style = “@style/textviewHeaderMain”

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

    机器人: 重力 = “开始”

    科特林

    文本 = “@string/app _ name”

    将滚动视图下的每个回收视图的 isNestedScrollingEnabled设置为 false

    val recyclerView = findViewById<RecyclerView>(R.id.recyclerView)
    recyclerView.isNestedScrollingEnabled = false
    
    App: layastraintLeft _ toLeftOf = “ father”

    使用 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" />
    
    应用程序: laysconstraintRight _ toRightOf = “ father”/>

    每个答案都是一样的。我已经按照大家的建议做了。然后我发现 NestedScrollView 比 ScrollView 更快,所以

    使用

    <androidx.core.widget.NestedScrollView
    
    < android.support. 約束. ConstraintLayout

    而不是

    <ScrollView
    
    Android: id = “@+ id/

    像往常一样用这个

    recycleView.setNestedScrollingEnabled(false);
    
    Android: layout _ width = “ match _ parent”

    将这一行添加到您的 JAVA 类中

    list.setNestedScrollingEnabled(false);
    
    Android: layout _ height = “ wrap _ content”

    我自己也有这个问题,在一个滚动视图中有一个回收视图,滚动看起来并不平滑。我的问题的原因是在回收者视图的顶部有一个滚动视图,这对于我的需求来说是不需要的。因此,在我删除了滚动视图并添加了 android:scrollbars="vertical"作为回收者视图之后,滚动就变得平滑了。

    Android: layout _ height = “ wrap _ content” Android: nestedScrollingEnable = “ false” App: layastraintLeft _ toLeftOf = “ father” 应用程序: laysconstraintRight _ toRightOf = “ father”/>

    您可以使用 ScrollView作为父级,使用 NestedScrollView作为子级。

    此代码适用于 ConstraintLayout android

    您可以使用 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>