Sto usando la nuova libreria di supporto ListAdapter
. Ecco il mio codice per l'adattatore
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)
}
}
}
Sto aggiornando l'adattatore con
musicViewModel.getAllArtists().observe(this, Observer {
it?.let {
artistAdapter.submitList(it)
}
})
La mia classe di diff
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
}
}
Ciò che accade è quando submitList viene chiamato la prima volta che l'adattatore esegue il rendering di tutti gli elementi, ma quando submitList viene chiamato di nuovo con le proprietà dell'oggetto aggiornate, non esegue nuovamente il rendering della vista che è cambiata.
Rende nuovamente la vista mentre scorro l'elenco, che a sua volta chiama bindView()
Inoltre, ho notato che la chiamata adapter.notifyDatasSetChanged()
dopo la lista di invio rende la vista con valori aggiornati, ma non voglio chiamarenotifyDataSetChanged()
perché l'adattatore dell'elenco ha diff utils integrato
Qualcuno può aiutarmi qui?
ArtistsDiff
e quindi alla realizzazione diArtist
se stesso.