Android TextInputLayout在RecyclingView内部缓慢渲染

时间:2020-10-07 19:51:43

标签: android performance

我在回收视图的每个元素中使用多个TextInputLayout。 我注意到导航到包含此列表的片段很慢,并且滚动开始的几秒钟也很慢。一旦删除TextInputLayout,性能就会大大提高。

有没有一种方法可以在具有良好性能的回收视图中呈现TextInputLayout? 我主要想将这种布局用于其动画和设计。

这是我在回收视图中单个项目的布局:

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.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="200dp"
    android:layout_margin="16dp"
    android:background="#FFFFFF"
    android:elevation="8dp">


    <ImageButton
        android:id="@+id/imageButton2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="16dp"
        android:background="?attr/selectableItemBackgroundBorderless"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:srcCompat="@drawable/ic_baseline_add_24" />

        <TextView
            android:id="@+id/textView"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginStart="16dp"
            android:layout_marginTop="16dp"
            android:text="Bench Press"
            android:textSize="22sp"
            android:textStyle="bold"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent" />

        <Button
            android:id="@+id/button"
            style="@style/Widget.MaterialComponents.Button.TextButton"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginTop="32dp"
            android:layout_marginEnd="28dp"
            android:text="Remove Exercise"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintTop_toBottomOf="@+id/linearLayout" />

        <LinearLayout
            android:id="@+id/linearLayout"
            android:layout_width="match_parent"
            android:layout_height="50dp"
            android:layout_marginTop="16dp"
            android:orientation="horizontal"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toBottomOf="@+id/textView"
            android:baselineAligned="false">
            <com.google.android.material.textfield.TextInputLayout
                android:id="@+id/textField1"
                style="@style/Widget.MaterialComponents.TextInputLayout.FilledBox.Dense"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:layout_marginStart="16dp"
                android:layout_marginEnd="16dp"
                android:layout_weight="1"
                android:hint="Reps">

                <com.google.android.material.textfield.TextInputEditText
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content" />

            </com.google.android.material.textfield.TextInputLayout>

            <com.google.android.material.textfield.TextInputLayout
                android:id="@+id/textField2"
                style="@style/Widget.MaterialComponents.TextInputLayout.FilledBox.Dense"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:layout_marginStart="16dp"
                android:layout_marginEnd="16dp"
                android:layout_weight="1"
                android:hint="Sets">

                <com.google.android.material.textfield.TextInputEditText
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content" />

            </com.google.android.material.textfield.TextInputLayout>

            <com.google.android.material.textfield.TextInputLayout
                android:id="@+id/textField3"
                style="@style/Widget.MaterialComponents.TextInputLayout.FilledBox.Dense"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginStart="16dp"
                android:layout_marginEnd="16dp"
                android:layout_weight="1"
                android:hint="Rest">

                <com.google.android.material.textfield.TextInputEditText
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content" />

            </com.google.android.material.textfield.TextInputLayout>
        </LinearLayout>

</androidx.constraintlayout.widget.ConstraintLayout>

片段代码:

class EditRoutineFragment : Fragment() {
    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        return inflater.inflate(R.layout.fragment_edit_routine, container, false)
    }

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        val adapter = EditRoutineListAdapter()
        requireView().rv_list.apply {
            this.adapter = adapter
            layoutManager = LinearLayoutManager(context)
            setHasFixedSize(true)
        }
    }
}

回收View适配器

class EditRoutineListAdapter: RecyclerView.Adapter<EditRoutineListAdapter.ViewHolder>() {
    class ViewHolder(itemView: ViewGroup): RecyclerView.ViewHolder(itemView)


    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
        val view = LayoutInflater
            .from(parent.context)
            .inflate(R.layout.rv_edit_routine_list_item, parent, false) as ViewGroup

        return ViewHolder(view)
    }

    override fun getItemCount() = 16

    override fun onBindViewHolder(holder: ViewHolder, position: Int) {

    }
}

1 个答案:

答案 0 :(得分:0)

您可以忽略ImageButton并使用内置选项,例如:

        app:endIconMode="custom"
        app:endIconDrawable="@drawable/ic_check_circle_24dp"
        app:endIconContentDescription="@string/content_description_end_icon"

还检查RecyclerView on Bind方法花费的时间太长(即onBindViewHolder(VH,int))应该非常简单,并且除最复杂的项目外,其他所有时间都少于一毫秒。