Używam nowej biblioteki pomocy ListAdapter. Oto mój kod adaptera
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)
}
}
}
Aktualizuję adapter za pomocą
musicViewModel.getAllArtists().observe(this, Observer {
it?.let {
artistAdapter.submitList(it)
}
})
Moja klasa różnicowa
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
}
}
Dzieje się tak, gdy funkcja submitList jest wywoływana przy pierwszym renderowaniu przez adapter wszystkich elementów, ale ponowne wywołanie metody submitList ze zaktualizowanymi właściwościami obiektu nie powoduje ponownego renderowania zmienionego widoku.
Ponownie renderuje widok, gdy przewijam listę, która z kolei wywołuje bindView()
Zauważyłem również, że wywołanie adapter.notifyDatasSetChanged()po przesłaniu listy renderuje widok ze zaktualizowanymi wartościami, ale nie chcę wywoływać, notifyDataSetChanged()ponieważ adapter listy ma wbudowane narzędzia różnicowe
Czy ktoś mógłby mi tu pomóc?

ArtistsDiffz realizacjąArtistsamego siebie.