RecyclerView onMeasure性能问题

2024-02-15

我在 recyclerView 中使用相当复杂的 recyclerView 项目布局。我已经开始遇到性能问题有一段时间了。每次运行应用程序时,我都会在 recyclerView 中的视图布局膨胀时收到警告。例如:

D/View: [ANR Warning]onMeasure time too long, this =android.support.constraint.ConstraintLayout{91a57db V.E...... ......I. 0,0-0,0 #7f0801d4 app:id/parentLayout}time =807 ms
D/View: [ANR Warning]onMeasure time too long, this =android.support.constraint.ConstraintLayout{20858c2 V.E...... ......I. 0,0-0,0 #7f0801d4 app:id/parentLayout}time =745 ms
D/View: [ANR Warning]onMeasure time too long, this =android.support.constraint.ConstraintLayout{880b0bc V.E...... ......I. 0,0-0,0 #7f0801d4 app:id/parentLayout}time =705 ms

每个项目平均 800 毫秒,对于充气来说确实是很长的时间。我测量过onBindViewHolder()绑定时间每个项目最多 10 毫秒,这很好。

有什么办法可以减少这个测量时间吗?我只用过ConstraintLayouts我发现由于其快速性能,建议对 recyclerView 项目使用约束。

该项目包含可扩展布局,该布局将在单击项目时展开。

项目布局:

<android.support.constraint.ConstraintLayout
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/parentLayout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">

<android.support.constraint.ConstraintLayout
    android:id="@+id/itemInfo"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <ImageView
        android:id="@+id/imageView"
        android:layout_width="80dp"
        android:layout_height="80dp"
        android:layout_alignParentStart="true"
        android:layout_marginBottom="8dp"
        android:layout_marginStart="16dp"
        android:layout_marginTop="8dp"
        android:visibility="visible"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_goneMarginBottom="16dp"
        app:srcCompat="@mipmap/ic_launcher" />

    <android.support.constraint.ConstraintLayout
        android:id="@+id/itemTextLayout"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_marginBottom="16dp"
        android:layout_marginEnd="16dp"
        android:layout_marginStart="16dp"
        android:layout_marginTop="16dp"
        android:visibility="visible"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toEndOf="@+id/imageView"
        app:layout_constraintTop_toTopOf="parent">

        <TextView
            android:id="@+id/itemName"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_gravity="fill"
            android:singleLine="false"
            android:text="itemName"
            android:textColor="@color/colorItemMajor"
            android:textSize="16sp"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent" />

        <android.support.constraint.ConstraintLayout
            android:id="@+id/BottomLineLayout"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_marginEnd="8dp"
            android:layout_marginTop="4dp"
            android:visibility="visible"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toStartOf="@+id/itemRate_icon"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toBottomOf="@id/itemName">

            <ImageView
                android:id="@+id/itemStatus"
                android:layout_width="wrap_content"
                android:layout_height="12dp"
                android:layout_marginEnd="4dp"
                app:layout_constraintBottom_toBottomOf="parent"
                app:layout_constraintEnd_toStartOf="@+id/itemSupplier"
                app:layout_constraintStart_toStartOf="parent"
                app:layout_constraintTop_toTopOf="parent" />

            <TextView
                android:id="@+id/itemSupplier"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_gravity="fill"
                android:layout_marginEnd="4dp"
                android:text="suppName"
                android:textColor="@color/colorItemMinor"
                android:textSize="10sp"
                app:layout_constraintBottom_toBottomOf="parent"
                app:layout_constraintEnd_toStartOf="@+id/itemDel_icon"
                app:layout_constraintStart_toEndOf="@id/itemStatus"
                app:layout_constraintTop_toTopOf="parent" />

            <ImageView
                android:id="@+id/itemDel_icon"
                android:layout_width="12dp"
                android:layout_height="12dp"
                android:layout_marginEnd="4dp"
                app:layout_constraintBottom_toBottomOf="parent"
                app:layout_constraintEnd_toStartOf="@+id/itemDel"
                app:layout_constraintStart_toEndOf="@id/itemSupplier"
                app:layout_constraintTop_toTopOf="parent"
                app:srcCompat="@mipmap/ic_launcher" />

            <TextView
                android:id="@+id/itemDel"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_gravity="fill"
                android:layout_marginEnd="4dp"
                android:text="itemDel"
                android:textColor="@color/colorItemMinor"
                android:textSize="10sp"
                app:layout_constraintBottom_toBottomOf="parent"
                app:layout_constraintEnd_toStartOf="@+id/itemWT_icon"
                app:layout_constraintStart_toEndOf="@+id/itemDel_icon"
                app:layout_constraintTop_toTopOf="parent" />

            <ImageView
                android:id="@+id/itemWT_icon"
                android:layout_width="12dp"
                android:layout_height="12dp"
                android:layout_marginStart="4dp"
                app:layout_constraintBottom_toBottomOf="parent"
                app:layout_constraintStart_toEndOf="@id/itemDel"
                app:layout_constraintTop_toTopOf="parent"
                app:srcCompat="@mipmap/ic_launcher" />

            <TextView
                android:id="@+id/itemWT"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_alignBaseline="@+id/itemWT_icon"
                android:layout_alignBottom="@+id/itemWT_icon"
                android:layout_gravity="fill"
                android:layout_marginStart="4dp"
                android:layout_toEndOf="@+id/itemWT_icon"
                android:text="itemWT"
                android:textColor="@color/colorItemMinor"
                android:textSize="10sp"
                app:layout_constraintBottom_toBottomOf="parent"
                app:layout_constraintStart_toEndOf="@+id/itemWT_icon"
                app:layout_constraintTop_toTopOf="parent" />
        </android.support.constraint.ConstraintLayout>

        <ImageView
            android:id="@+id/itemRate_icon"
            android:layout_width="12dp"
            android:layout_height="12dp"
            android:layout_marginEnd="4dp"
            android:layout_marginTop="4dp"
            app:layout_constraintEnd_toStartOf="@id/itemRate"
            app:layout_constraintTop_toBottomOf="@+id/itemName"
            app:srcCompat="@mipmap/ic_launcher" />

        <TextView
            android:id="@+id/itemRate"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignBaseline="@+id/itemRate_icon"
            android:layout_alignBottom="@+id/itemRate_icon"
            android:layout_gravity="fill"
            android:layout_marginTop="4dp"
            android:text="itemRate"
            android:textColor="@color/colorRating"
            android:textSize="10sp"
            android:textStyle="bold"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintTop_toBottomOf="@+id/itemName" />

    </android.support.constraint.ConstraintLayout>

</android.support.constraint.ConstraintLayout>

<android.support.constraint.ConstraintLayout
    android:id="@+id/expandable_layout"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:animateLayoutChanges="true"
    android:background="@color/colorBackground"
    android:orientation="horizontal"
    android:visibility="visible"
    app:layout_constraintTop_toBottomOf="@+id/itemInfo">

    <ImageView
        android:id="@+id/arrowPointer"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:srcCompat="@mipmap/ic_launcher"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <TextView
        android:id="@+id/itemDesc"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_gravity="fill"
        android:layout_marginEnd="32dp"
        android:layout_marginStart="16dp"
        android:layout_marginTop="24dp"
        android:singleLine="false"
        android:text="This is some item desc."
        android:textColor="@color/colorItemMinor"
        android:textSize="12sp"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <ImageView
        android:id="@+id/itemWeight_icon"
        android:layout_width="12sp"
        android:layout_height="12sp"
        android:layout_marginStart="16dp"
        android:layout_marginTop="20dp"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@id/itemDesc"
        app:srcCompat="@mipmap/ic_launcher" />

    <TextView
        android:id="@+id/itemWeight"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBaseline="@+id/itemWeight_icon"
        android:layout_alignBottom="@+id/itemWeight_icon"
        android:layout_gravity="fill"
        android:layout_marginStart="4dp"
        android:layout_marginTop="20dp"
        android:layout_toEndOf="@+id/itemWeight_icon"
        android:text="itemWeight"
        android:textColor="@color/colorItemMinor"
        android:textSize="10sp"
        app:layout_constraintStart_toEndOf="@+id/itemWeight_icon"
        app:layout_constraintTop_toBottomOf="@+id/itemDesc" />

    <ImageView
        android:id="@+id/itemType_icon"
        android:layout_width="12sp"
        android:layout_height="12sp"
        android:layout_marginStart="8dp"
        android:layout_marginTop="20dp"
        app:layout_constraintStart_toEndOf="@id/itemWeight"
        app:layout_constraintTop_toBottomOf="@id/itemDesc"
        app:srcCompat="@mipmap/ic_launcher" />

    <TextView
        android:id="@+id/itemType"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBaseline="@+id/itemType_icon"
        android:layout_alignBottom="@+id/itemType_icon"
        android:layout_gravity="fill"
        android:layout_marginStart="4dp"
        android:layout_marginTop="20dp"
        android:layout_toEndOf="@+id/itemType_icon"
        android:text="itemType"
        android:textColor="@color/colorItemMinor"
        android:textSize="10sp"
        app:layout_constraintStart_toEndOf="@+id/itemType_icon"
        app:layout_constraintTop_toBottomOf="@+id/itemDesc" />

    <android.support.constraint.ConstraintLayout
        android:id="@+id/propertyRow"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="4dp"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@id/itemType_icon">

        <TextView
            android:id="@+id/propertyChangeClickableText"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="fill"
            android:layout_marginStart="16dp"
            android:clickable="true"
            android:focusable="true"
            android:text="Change Properties"
            android:textColor="@color/colorPrice"
            android:textSize="16sp"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent" />

        <ImageButton
            android:id="@+id/confirmItemButton"
            android:layout_width="56dp"
            android:layout_height="56dp"
            android:layout_marginEnd="16dp"
            android:background="@drawable/image_button_border_drawable"
            android:scaleType="fitCenter"
            app:srcCompat="@mipmap/ic_launcher"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintTop_toTopOf="parent" />
    </android.support.constraint.ConstraintLayout>

    <View
        android:id="@+id/separator"
        android:layout_width="match_parent"
        android:layout_height="1dp"
        android:layout_marginTop="16dp"
        android:background="@color/colorDivider"
        app:layout_constraintTop_toBottomOf="@id/propertyRow" />

    <android.support.constraint.ConstraintLayout
        android:id="@+id/topRowLayoutPopup"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="8dp"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@id/separator">

        <TextView
            android:id="@+id/itemSupplierName"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="fill"
            android:layout_marginStart="16dp"
            android:text="supName"
            android:textColor="@color/colorItemMajor"
            android:textSize="16sp"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent" />

        <ImageView
            android:id="@+id/property1_ico"
            android:layout_width="16dp"
            android:layout_height="16dp"
            android:layout_alignBaseline="@+id/itemSupplierName"
            android:layout_marginEnd="4dp"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toStartOf="@id/property2_ico"
            app:layout_constraintTop_toTopOf="parent"
            app:srcCompat="@mipmap/ic_launcher" />

        <ImageView
            android:id="@+id/property2_ico"
            android:layout_width="16dp"
            android:layout_height="16dp"
            android:layout_alignBaseline="@+id/itemSupplierName"
            android:layout_marginEnd="4dp"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toStartOf="@id/property3_ico"
            app:layout_constraintTop_toTopOf="parent"
            app:srcCompat="@mipmap/ic_launcher" />

        <ImageView
            android:id="@+id/property3_ico"
            android:layout_width="16dp"
            android:layout_height="16dp"
            android:layout_alignBaseline="@+id/itemSupplierName"
            android:layout_marginEnd="16dp"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintTop_toTopOf="parent"
            app:srcCompat="@mipmap/ic_launcher" />
    </android.support.constraint.ConstraintLayout>

    <android.support.constraint.ConstraintLayout
        android:id="@+id/bottomRowLayoutPopup"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginBottom="24dp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@id/topRowLayoutPopup">

        <TextView
            android:id="@+id/editSupplierButton"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignBaseline="@+id/supplierRatingBar"
            android:layout_marginStart="16dp"
            android:clickable="true"
            android:focusable="true"
            android:text="Edit Supplier"
            android:textColor="@color/colorPrice"
            android:textSize="16sp"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent" />

        <TextView
            android:id="@+id/supplierRating"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignBaseline="@+id/supplierRatingBar"
            android:layout_gravity="fill"
            android:layout_marginEnd="8dp"
            android:text="supplierRating"
            android:textColor="@color/colorRating"
            android:textSize="@dimen/food_list_bottom_row_font"
            android:textStyle="bold"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toStartOf="@id/supplierRatingBar"
            app:layout_constraintTop_toTopOf="parent" />

        <RatingBar
            android:id="@+id/supplierRatingBar"
            style="@style/RatingBarStyle"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginEnd="8dp"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toStartOf="@+id/supplierRatingRateNumber"
            app:layout_constraintTop_toTopOf="parent" />

        <TextView
            android:id="@+id/supplierRatingRateNumber"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignBaseline="@+id/supplierRatingBar"
            android:layout_gravity="fill"
            android:layout_marginEnd="16dp"
            android:text="RateNum"
            android:textColor="@color/colorItemMinor"
            android:textSize="10sp"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintTop_toTopOf="parent" />
    </android.support.constraint.ConstraintLayout>

</android.support.constraint.ConstraintLayout>

因此,正如 @RamiJemli 建议的那样,我将所有 ConstraintLayouts 替换为relativelayouts,并且性能非常棒。零跳帧 - 清晰的 60fps 应用程序运行。显然,那些关于 RecyclerViews 中的 ConstraintLayout >relativeLayout 的文章并不那么真实(至少在我的应用程序中)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

RecyclerView onMeasure性能问题 的相关文章

  • 如何在android中点击画布上绘制的圆圈?

    我正在开发一个人脸检测应用程序 在这个应用程序中 我必须在脸上的眼睛和嘴巴用户可以点击拖动圆圈 在检测到的人脸上根据自己设置位置 因此 所有圆圈都已成功绘制在脸上 但我无法单击特定圆圈并使用缩小选项在整个脸上移动 请建议我有关相同问题的正确
  • APK META-INF/library_release.kotlin_module 中复制的重复文件

    我最近通过 JitPack 添加了两个 Android 库 但出现以下错误 Duplicate files copied in APK META INF library release kotlin module 我已经清除了缓存 并尝试使
  • Canvas GetImageData() / PutImageData() 在移动设备上的性能很糟糕

    我正在做一个小型 HTML5 游戏 在地图开头加载精灵时 我使用 GetImageData 循环遍历所有图像 PutImageData 进行一些处理 这在我的电脑上运行得非常好 但是在我的手机上却慢得可怕 PC 5 6 ms iPhone
  • 任务“:app:checkReleaseDuplicateClasses”执行失败

    我的 React Native Android 构建中突然出现构建问题 令人惊讶的是 它是早上建好的 没有做任何改变 但突然就失败了 这就是我得到的错误 知道为什么会发生这种情况吗 在 stack 和 GitHub 中也看到了一些类似的问题
  • android - 过度绘制布局允许通过 LinearLayout 进行触摸

    在下面的 UI 中 我将下面的 drabable 覆盖了整个屏幕 LinearLayout 是透明的 并允许其下方的控件可单击或可触摸 基本上我可以滚动此 LinearLayout 下面的列表以及单击控件 我如何禁用它 See attach
  • Android 上的硬币识别

    我目前正在开发一个 Android 应用程序 它能够拍摄硬币的现有图像 或者使用内置摄像头扫描单个硬币 非常像 Google Goggles 我正在使用 Android 版 OpenCV 我的问题如下 什么方法最适合使用 OpenCV 在
  • PhoneGap 是应用程序开发的好选择吗? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • Android,语言文件不起作用

    我现在正在创建一个 Android 应用程序 并尝试为我的母语添加语言文件 但在某种程度上 这对我不起作用 我尝试在两部不同的手机中加载该应用程序 但结果相同 之前创建过语言文件 效果良好 但这次不行 手机设置为瑞典语 语言文件适用于我创建
  • Android 在创建时出现 SQLiteException

    首先我想说我是android新手 所以如果这个问题太愚蠢我很抱歉 我正在为带有两个表的 SQLite 数据库编写一个内容提供程序 表格上是在导航抽屉活动中显示列表 第二个表格是在 ListFragment 中显示 每次启动应用程序时 我都会
  • 如何从debug.keystore文件获取MD5?

    我使用一些命令来获取 MD5 私钥debug keystore文件 但实际上我得到的是 SHA1 私钥而不是 MD5 我不知道如何获得MD5 这是我使用的命令 keytool list alias androiddebugkey keyst
  • Android - 内容值覆盖现有行

    我正在尝试使用插入值ContentValues 我已将 5 个值插入到 5 列中 运行应用程序后 我只有最后一组值的行ContentValues 前四组未插入 ContentValues cv new ContentValues cv pu
  • 对基本适配器类及其功能的疑问

    我正在尝试自定义列表视图 我使用数组列表添加对象列表 并将其发送到扩展基本适配器的类 当我扩展基本适配器类时 它实现了一些方法 例如 getView 等 在 getView 中 我将其发送到将名称 数据 分配给 XML 格式的自定义菜单的类
  • Android框架结构与MFC/Win32结构的比较?

    我为 Android 和 Windows 进行开发 使用 MFC 有时使用 win32 昨天我随意比较了这两个框架 它们显然非常非常不同 因此 Windows 开发与 Android 开发有很大不同 我想知道人们认为 Android 这样的
  • 如何在Android中隐藏应用程序标题? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我想隐藏应用程序标题栏 您可以通过编程来完成 import android app Activity import android os
  • 在Android的activity中调用onResume

    在活动的过程中通过调用 this OnResume 强制 onResume 事件可以吗 或者我应该实现另一个由 OnResume 和第一个成员调用的过程 实现在您的重写中调用的另一个过程onResume 后者不打算由您调用 它是一种方便的方
  • 如果联系人与电话通讯录中的应用程序关联,则显示应用程序图标

    我正在尝试显示与该应用程序关联的电话号码的应用程序图标 我试着跟随this http www c99 org 2010 01 23 writing an android sync provider part 1 链接但是太难了 有没有任何库
  • MPAndroidChart:组合图表

    我在用MPAndroidChart 库 https github com PhilJay MPAndroidChart 我想用CombinedChart创建这样的图表 那可能吗 我尝试了一下 但似乎不起作用 因为 这些条目没有按我的预期工作
  • 从 AlertDialog 返回值

    我想构建一个函数来创建 AlertDialog 并返回用户输入的字符串 这是我用于创建对话框的函数 如何返回该值 String m Text private String openDialog String title AlertDialo
  • Exif 方向标签返回 0

    我正在开发一个自定义相机应用程序 我面临以下问题 当我尝试使用检索方向时ExifInterface 它总是返回 0 ORIENTATION UNDEFINED 这使我无法将图像旋转到正确的状态 从而无法正确显示 我使用示例代码来设置相机旋转
  • Admob - 没有广告可显示

    你好 我尝试制作一些在 Android 手机上显示广告的示例程序 并尝试在 v2 2 的模拟器上测试它 代码中的一切似乎都很好 但调试器中的 AdListener 表示 响应消息为零或空 onFailedToReceiveAd 没有广告可显

随机推荐