【问题标题】:Recycler View loading very slow for large data when inside NestedScrollView在 NestedScrollView 内时,Recycler View 加载大数据时非常慢
【发布时间】:2017-06-16 04:36:00
【问题描述】:

我在NestedScrollView 中添加了RecyclerView。基本上我希望 RecyclerView 与其他视图一起滚动。我面临的问题是,对于一小部分数据,它工作正常,但是对于大量数据(200 个条目),每当我启动活动时,它会冻结大约 3-5 秒然后加载。我删除了NestedScrollView,它工作正常,但它没有提供我想要的行为。

(有关额外信息,我正在从 SQLite 数据库加载数据。滚动没有问题,因为它很流畅。唯一的问题是活动冻结了一段时间)

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

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

                <... Some other Views ...>

                <android.support.v7.widget.RecyclerView
                    android:layout_width="wrap_content"
                    android:layout_height="match_parent"
                    android:orientation="vertical">

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

            </LinearLayout>

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

【问题讨论】:

  • 试试recyclerView.setNestedScrollingEnabled(false);
  • 是的,我试过了,它不起作用,正如我所说,滚动没有问题
  • 请显示您的 java 代码,您正在从数据库中获取数据并将该数据填充到您的布局中。
  • 数据库查询是在一个新的IO线程上执行的,数据是传给主线程的,然后是列表传给recycler适配器的,我说的时候没有问题我删除了嵌套的滚动视图!
  • 问题是当你在嵌套滚动视图中膨胀回收器视图时,它开始为每个项目膨胀一个视图,所以如果你的回收器适配器中有 500 个项目,那么它将创建 500 个项目布局,这会导致突然无响应,我所做的是删除了嵌套滚动布局,没有找到任何解决方案可以使嵌套滚动视图在大量数据的情况下与回收器视图一起使用。

标签: java android android-recyclerview android-nestedscrollview


【解决方案1】:

RecyclerView里面NestedScrollView这个案例。

RecyclerView 调用onCreateViewHolder() 的次数等于您的数据大小。

如果数据有 200 项,它会冻结 onCreateViewHolder() 被调用 200 次。

【讨论】:

【解决方案2】:

上面所说的问题是因为 RecyclerView 作为一个子项或 NestedScrollView 中的子项,当您使用 WRAP_CONTENT 或 MATCH_PARENT 作为 RecyclerView 的高度时,它的高度测量为不定式。

为我解决此问题的一个解决方案是将 RecyclerView 高度设置为固定大小。您可以将高度设置为 dp 值,或者如果您的要求需要垂直不定式 RecyclerView,则可以将其设置为与设备高度匹配的像素值。

这是一个sn-p,用于在kotlin中设置recyclerView的大小

    val params = recyclerView.layoutParams
    params.apply {
            width = context.resources.displayMetrics.widthPixels
            height = context.resources.displayMetrics.heightPixels
    }
    recyclerView.layoutParams = params

【讨论】:

    【解决方案3】:

    我遇到了同样的问题! 解决方案是将 NestedScrollView 更改为 SwipeRefreshLayout。

    添加此项以启用/禁用工具栏滚动:

    ViewCompat.setNestedScrollingEnabled(recyclerView, true);

    【讨论】:

      【解决方案4】:

      正如 Nancy 所说,recyclerview.setNestedScrollingEnabled(false);将解决滚动卡住的问题。我也遇到过此类问题,并通过错误的 NestedScroll 解决。

      【讨论】:

      • 滚动不是问题,问题是活动冻结了几秒钟,当它完全加载时它完美滚动,我总是使用 setNestedScrollingEnabled(false) 选项,但没有赢!
      • @GurleenSethi 你找到解决方案了吗?我现在也面临同样的问题。
      猜你喜欢
      • 1970-01-01
      • 2022-01-11
      • 2014-02-15
      • 1970-01-01
      • 1970-01-01
      • 2017-04-09
      • 1970-01-01
      • 1970-01-01
      • 2021-08-19
      相关资源
      最近更新 更多