Saya menggunakan pustaka dukungan baru ListAdapter
. Ini kode saya untuk adaptor
class ArtistsAdapter : ListAdapter<Artist, ArtistsAdapter.ViewHolder>(ArtistsDiff()) {
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
return ViewHolder(parent.inflate(R.layout.item_artist))
}
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
holder.bind(getItem(position))
}
class ViewHolder(view: View) : RecyclerView.ViewHolder(view) {
fun bind(artist: Artist) {
itemView.artistDetails.text = artist.artistAlbums
.plus(" Albums")
.plus(" \u2022 ")
.plus(artist.artistTracks)
.plus(" Tracks")
itemView.artistName.text = artist.artistCover
itemView.artistCoverImage.loadURL(artist.artistCover)
}
}
}
Saya memperbarui adaptor dengan
musicViewModel.getAllArtists().observe(this, Observer {
it?.let {
artistAdapter.submitList(it)
}
})
Kelas diff saya
class ArtistsDiff : DiffUtil.ItemCallback<Artist>() {
override fun areItemsTheSame(oldItem: Artist?, newItem: Artist?): Boolean {
return oldItem?.artistId == newItem?.artistId
}
override fun areContentsTheSame(oldItem: Artist?, newItem: Artist?): Boolean {
return oldItem == newItem
}
}
Apa yang terjadi adalah ketika submitList dipanggil pertama kali adaptor merender semua item, tetapi ketika submitList dipanggil lagi dengan properti objek yang diperbarui itu tidak merender ulang tampilan yang telah berubah.
Ini membuat ulang tampilan saat saya menggulir daftar, yang pada gilirannya memanggil bindView()
Juga, saya perhatikan bahwa memanggil adapter.notifyDatasSetChanged()
setelah mengirimkan daftar merender tampilan dengan nilai yang diperbarui, tetapi saya tidak ingin memanggil notifyDataSetChanged()
karena adaptor daftar memiliki utilitas diff built-in
Adakah yang bisa membantu saya di sini?
ArtistsDiff
dan dengan demikian implementasiArtist
itu sendiri.