Медленно работает onCreateViewHolder

Я написал RecyclerView, который должен содержать около 100 элементов. Работает как и ожидалось, но есть проблема: ViewHolder слишком долго раздувается при быстрой прокрутке. Когда раздуется нужное количество ViewHolder'ов, все работает плавно.

Я пытался поместить весь list item во FrameLayout и даже раздуть некоторое количество ViewHolder'ов на этапе инициализации адаптера. Также игрался с пулом и кэшем. Ничего не помогло. Буду благодарен, если хоть что-нибудь напишите по этой теме.

Код Diff Util:

class ClansDiffUtil: DiffUtil.ItemCallback<ClansModel>(){
override fun areItemsTheSame(oldItem: ClansModel, newItem: ClansModel): Boolean {
    return oldItem.clan == newItem.clan
}

override fun areContentsTheSame(oldItem: ClansModel, newItem: ClansModel): Boolean {
    return oldItem == newItem
}

Код адаптера:

class ClansAdapter() : ListAdapter<ClansModel, ClansAdapter.ViewHolder>(ClansDiffUtil()) {

override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {

    return ViewHolder.from(parent)

}

override fun onBindViewHolder(holder: ViewHolder, position: Int) {
    val item = getItem(position)
    holder.bind(item)
}

private lateinit var mRecyclerView: RecyclerView
override fun onAttachedToRecyclerView(recyclerView: RecyclerView) {
    super.onAttachedToRecyclerView(recyclerView)
    mRecyclerView = recyclerView
}

class ViewHolder(val binding: ClansListFragmentBinding) : RecyclerView.ViewHolder(binding.root) {

    fun bind(item: ClansModel) {
        binding.apply {
            clanName.text = item.clan
            clanLeader.text = item.clanLeader
            clanMembers.text = item.members.toString()
            clanPoints.text = item.points.toString()
            clanRank.text = item.rank.toString()
            executePendingBindings()
        }
    }

    companion object {
       fun from(parent: ViewGroup): ViewHolder {

                val layoutInflater = LayoutInflater.from(parent.context)
                val binding = ClansListFragmentBinding
                        .inflate(layoutInflater, parent, false)
                return ViewHolder(binding)
        }
    }
}

}

ClansModel:

data class ClansModel(
    val server: Short,
    var clan: String,
    val clanLeader: String,
    val members: Short,
    val points: Long,
    val rank: Short

)

Код list item:

<layout 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">
    
        <androidx.cardview.widget.CardView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_margin="8sp"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent">
    
            <androidx.constraintlayout.widget.ConstraintLayout
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:background="@color/itemColor"
                android:paddingBottom="8sp">
    
                <TextView
                    android:id="@+id/clanRank"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_marginStart="8dp"
                    android:layout_marginTop="8dp"
                    android:textSize="@dimen/recycler_text_size"
                    app:layout_constraintStart_toStartOf="parent"
                    app:layout_constraintTop_toTopOf="parent" />
    
    
                <TextView
                    android:id="@+id/clanName"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_marginStart="8dp"
                    android:textSize="@dimen/recycler_text_size"
                    app:layout_constraintBottom_toBottomOf="@+id/clanRank"
                    app:layout_constraintStart_toEndOf="@+id/clanRank"
                    app:layout_constraintTop_toTopOf="@+id/clanRank" />
    
                <TextView
                    android:id="@+id/clanLeader"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_marginStart="8dp"
                    android:textSize="@dimen/recycler_text_size"
                    app:layout_constraintBottom_toBottomOf="@+id/textView"
                    app:layout_constraintStart_toEndOf="@+id/textView"
                    app:layout_constraintTop_toTopOf="@+id/textView"
                    app:layout_constraintVertical_bias="0.0" />
    
                <TextView
                    android:id="@+id/clanPoints"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_marginTop="8dp"
                    android:textSize="@dimen/recycler_text_size"
                    app:layout_constraintEnd_toEndOf="@+id/clanMembers"
                    app:layout_constraintStart_toStartOf="@+id/clanMembers"
                    app:layout_constraintTop_toTopOf="parent" />
    
                <TextView
                    android:id="@+id/clanMembers"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:textSize="@dimen/recycler_text_size"
                    app:layout_constraintBottom_toBottomOf="@+id/clanLeader"
                    app:layout_constraintEnd_toEndOf="parent"
                    app:layout_constraintHorizontal_bias="0.88"
                    app:layout_constraintStart_toStartOf="parent"
                    app:layout_constraintTop_toTopOf="@+id/clanLeader" />
    
                <TextView
                    android:id="@+id/textView"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_marginStart="8dp"
                    android:layout_marginTop="16dp"
                    android:text="@string/clan_leader"
                    android:textSize="@dimen/recycler_text_size"
                    app:layout_constraintStart_toStartOf="parent"
                    app:layout_constraintTop_toBottomOf="@+id/clanRank" />
    
                <TextView
                    android:id="@+id/point"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_marginEnd="8dp"
                    android:text="@string/pointClan"
                    android:textSize="@dimen/recycler_text_size"
                    app:layout_constraintBottom_toBottomOf="@+id/clanPoints"
                    app:layout_constraintEnd_toStartOf="@+id/clanPoints"
                    app:layout_constraintTop_toTopOf="@+id/clanPoints" />
    
                <TextView
                    android:id="@+id/allMembers"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="@string/allMembers"
                    android:textSize="@dimen/recycler_text_size"
                    app:layout_constraintBottom_toBottomOf="parent"
                    app:layout_constraintEnd_toEndOf="parent"
                    app:layout_constraintHorizontal_bias="0.0"
                    app:layout_constraintStart_toEndOf="@+id/clanMembers" />
    
            </androidx.constraintlayout.widget.ConstraintLayout>
    
        </androidx.cardview.widget.CardView>
    
    </layout>

Информация из лога при прокрутке, когда пропускаются фреймы

I/Choreographer: Skipped 3 frames!  The application may be doing too much work on its main thread.
I/Choreographer: Skipped 4 frames!  The application may be doing too much work on its main thread.
I/Choreographer: Skipped 3 frames!  The application may be doing too much work on its main thread.

Ответы (0 шт):