为什么在 RecyclerView 项中 ConstraintLayout 比 LinearLayout 慢?

Mos*_*ail 6 android android-layout android-recyclerview android-constraintlayout

我正在将 recyclyerView 的 xml 项从 LinearLayout 更改为 ConstraintLayout。当我水平滚动 recyclerView 时,它比 LinearLayout 滞后并且呈现得非常慢。

约束布局

约束布局

线性布局

线性布局

在这里,我将分享我的 ConstraintLayout xml。

我的 ConstraintLayout 项目

<android.support.v7.widget.CardView 
    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="85dp"
    android:layout_height="wrap_content">

<android.support.constraint.ConstraintLayout
    android:id="@+id/merchant_layout"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_marginBottom="10dp"
    android:layout_marginEnd="5dp"
    android:layout_marginStart="5dp">

    <de.hdodenhof.circleimageview.CircleImageView
        android:id="@+id/merchant_img"
        android:layout_width="75dp"
        android:layout_height="75dp"
        android:transitionName="profile"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        tools:ignore="UnusedAttribute"
        tools:src="@drawable/avatar" />

    <com.max.xclusivekotlin.customViews.MyTextView
        android:id="@+id/merchant_name"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_marginEnd="5dp"
        android:layout_marginStart="5dp"
        android:layout_marginTop="5dp"
        android:ellipsize="end"
        android:maxLines="1"
        android:maxWidth="72dp"
        android:minWidth="72dp"
        android:textAlignment="center"
        android:textColor="@color/blackFont"
        android:textSize="14sp"
        app:layout_constraintEnd_toEndOf="@id/merchant_img"
        app:layout_constraintStart_toStartOf="@id/merchant_img"
        app:layout_constraintTop_toBottomOf="@id/merchant_img"
        tools:text="Chili's" />

    <com.max.xclusivekotlin.customViews.MyTextView
        android:id="@+id/merchant_offer_percent"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textColor="@color/redColor"
        android:textSize="12sp"
        app:layout_constraintBottom_toTopOf="@id/tv_distance"
        app:layout_constraintEnd_toStartOf="@id/merchant_offer_type"
        app:layout_constraintStart_toStartOf="@id/merchant_name"
        app:layout_constraintTop_toBottomOf="@id/merchant_name"
        app:textBold="bold"
        tools:text="25%" />

    <com.max.xclusivekotlin.customViews.MyTextView
        android:id="@+id/merchant_offer_type"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:ellipsize="end"
        android:lines="1"
        android:textColor="@color/blackFont"
        android:textSize="12sp"
        app:layout_constraintBottom_toTopOf="@id/tv_distance"
        app:layout_constraintEnd_toEndOf="@id/merchant_name"
        app:layout_constraintHorizontal_chainStyle="packed"
        app:layout_constraintStart_toEndOf="@id/merchant_offer_percent"
        app:layout_constraintTop_toBottomOf="@id/merchant_name"
        tools:text=" | Refund " />

    <com.max.xclusivekotlin.customViews.MyTextView
         android:id="@+id/tv_distance"
         android:layout_width="0dp"
         android:layout_height="wrap_content"
         android:ellipsize="end"
         android:lines="1"
         android:textAlignment="center"
         android:textColor="@color/greyFont"
         android:textSize="14sp"
         android:visibility="gone"
         app:layout_constraintBottom_toBottomOf="parent"
         app:layout_constraintEnd_toEndOf="@id/merchant_img"
         app:layout_constraintStart_toStartOf="@id/merchant_img"
         app:layout_constraintTop_toBottomOf="@id/merchant_offer_percent" />
    </android.support.constraint.ConstraintLayout>
</android.support.v7.widget.CardView>
Run Code Online (Sandbox Code Playgroud)

我的 LinearLayout 项目

<android.support.v7.widget.CardView 
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="85dp"
    android:layout_height="wrap_content">

<LinearLayout
    android:id="@+id/merchant_layout"
    android:layout_width="75dp"
    android:layout_height="wrap_content"
    android:layout_marginEnd="5dp"
    android:layout_marginStart="5dp"
    android:gravity="center_horizontal"
    android:orientation="vertical"
    android:paddingBottom="10dp">

    <de.hdodenhof.circleimageview.CircleImageView
        android:id="@+id/merchant_img"
        android:layout_width="75dp"
        android:layout_height="75dp"
        android:transitionName="profile"
        tools:ignore="UnusedAttribute"
        tools:src="@drawable/avatar" />

    <com.max.xclusivekotlin.customViews.MyTextView
        android:id="@+id/merchant_name"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginEnd="5dp"
        android:layout_marginStart="5dp"
        android:layout_marginTop="5dp"
        android:ellipsize="end"
        android:maxLines="1"
        android:maxWidth="72dp"
        android:minWidth="72dp"
        android:textAlignment="center"
        android:textColor="@color/blackFont"
        android:textSize="14sp"
        tools:text="Chili's" />

    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginEnd="5dp"
        android:layout_marginStart="5dp"
        android:orientation="horizontal">

        <com.max.xclusivekotlin.customViews.MyTextView
            android:id="@+id/merchant_offer_percent"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textColor="@color/redColor"
            android:textSize="12sp"
            app:textBold="bold"
            tools:text="25%" />

        <com.max.xclusivekotlin.customViews.MyTextView
            android:id="@+id/merchant_offer_type"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:ellipsize="end"
            android:lines="1"
            android:textColor="@color/blackFont"
            android:textSize="12sp"
            tools:text=" | Refund " />
    </LinearLayout>

    <com.max.xclusivekotlin.customViews.MyTextView
        android:id="@+id/tv_distance"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:ellipsize="end"
        android:lines="1"
        android:textAlignment="center"
        android:textColor="@color/greyFont"
        android:textSize="14sp"
        android:visibility="gone" />
    </LinearLayout>
</android.support.v7.widget.CardView>
Run Code Online (Sandbox Code Playgroud)

我该如何解决这个问题?

Ali*_*aki 5

也许对于您在性能ConstraintLayoutRecyclerView性能中使用的很多约束。

我建议你使用 RelativeLayout

这些链接可以帮助您:

提高 RecyclerView 性能

相对布局和约束布局性能

如何让 RecyclerView 流畅


Abh*_*pta 3

相对布局:

\n\n

RelativeLayout是一种通过级别(一级解决)轮廓实现复杂格式的方法。从它的轮廓来看,它是在覆盖事物,完全不像LinearLayout它的名字所说的那样,独立于其他任何人,RelativeLayout非常擅长将事物与其他事物相关联。假设您的视图宽度未确定,并且需要同时将一个物体放置在其一侧和底部。你可以用 来做到这一点LinearLayout,但是,这需要两个时间才能解决,而且RelativeLayout它变得更加干净。

\n\n

约束布局:

\n\n

中心是RelativeLayout事物可以重叠的地方。尽管如此,令人ConstraintLayout惊叹的是它可以取代各种设计:框架、相对、线性。确实,有许多不同的格式,但这些都是包装器。我喜欢的ConstraintLayout是,在我不关心它之前,它非常适合用作设计模式的一部分。大多数情况下,鉴于我的公平设备(适用于 Android Studio)的性能不佳,并且定期渲染错误ConstraintLayout属性确实如此之长且令人震惊,因此最好使用它的设计模式。RelativeLayout它可以控制视角的位置和测量(完全不像)。请记住,以layout_开头的参数隐含用于包装格式。视图本身不处理这些

\n\n

因此,您可以通过命令链利用您最喜欢的重量LinearLayoutConstraintLayout从左/右/顶部/底部着陆RelativeLayout,覆盖诸如简单的东西,FrameLayout我认为没有人使用GridLayout,这太令人失望了,一直受到青睐LinearLayoutConstraintLayout您可以做到这一点毫不费力地

\n\n

约束布局缺点:

\n\n

尽管大纲模式非常棒,但它仍然不如 XML 完美。它变得很混乱,你必须放大视角,它会驱使你变得简单ConstraintLayout,如果你试图包含一些固定的设计\xe2\x80\x93,你会三思而后行。

\n\n

希望对你有帮助。

\n