Медленно работает 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.