Ich verwende die neue Support-Bibliothek ListAdapter
. Hier ist mein Code für den Adapter
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)
}
}
}
Ich aktualisiere den Adapter mit
musicViewModel.getAllArtists().observe(this, Observer {
it?.let {
artistAdapter.submitList(it)
}
})
Meine Diff-Klasse
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
}
}
Was passiert, ist, wenn submitList zum ersten Mal aufgerufen wird, wenn der Adapter alle Elemente rendert, aber wenn submitList mit aktualisierten Objekteigenschaften erneut aufgerufen wird, wird die geänderte Ansicht nicht erneut gerendert.
Es rendert die Ansicht neu, während ich durch die Liste scrolle, was wiederum aufruft bindView()
Außerdem ist mir aufgefallen, dass beim Aufruf adapter.notifyDatasSetChanged()
nach dem Senden der Liste die Ansicht mit aktualisierten Werten gerendert wird. Ich möchte jedoch nicht aufrufen, notifyDataSetChanged()
da im Listenadapter verschiedene Dienstprogramme integriert sind
Kann mir hier jemand helfen?
ArtistsDiff
und damit mit der Implementierung von sichArtist
selbst zusammenhängen.