Estoy usando la nueva biblioteca de soporte ListAdapter
. Aquí está mi código para el adaptador
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)
}
}
}
Estoy actualizando el adaptador con
musicViewModel.getAllArtists().observe(this, Observer {
it?.let {
artistAdapter.submitList(it)
}
})
Mi clase diferencial
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
}
}
Lo que sucede es cuando se llama a submitList la primera vez que el adaptador procesa todos los elementos, pero cuando se llama de nuevo a submitList con las propiedades del objeto actualizadas, no se vuelve a representar la vista que ha cambiado.
Vuelve a renderizar la vista a medida que me desplazo por la lista, que a su vez llama bindView()
Además, he notado que llamar adapter.notifyDatasSetChanged()
después de enviar la lista muestra la vista con valores actualizados, pero no quiero llamar notifyDataSetChanged()
porque el adaptador de lista tiene utilidades de diferencia incorporadas
¿Me puede ayudar alguien?
ArtistsDiff
y, por tanto, con suArtist
propia implementación .