【发布时间】:2018-09-18 11:09:31
【问题描述】:
我正在使用新的支持库ListAdapter。这是我的适配器代码
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)
}
}
}
我正在用
更新适配器musicViewModel.getAllArtists().observe(this, Observer {
it?.let {
artistAdapter.submitList(it)
}
})
我的差异类
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
}
}
发生的情况是当适配器第一次调用 submitList 渲染所有项目时,但是当使用更新的对象属性再次调用 submitList 时,它不会重新渲染已更改的视图。
它会在我滚动列表时重新渲染视图,然后调用bindView()
另外,我注意到在提交列表后调用 adapter.notifyDatasSetChanged() 会使用更新的值呈现视图,但我不想调用 notifyDataSetChanged(),因为列表适配器内置了 diff utils
有人可以帮我吗?
【问题讨论】:
-
问题可能与
ArtistsDiff有关,因此与Artist本身的实现有关。 -
是的,我也这么认为,但我似乎无法确定
-
您可以调试它或添加日志语句。您也可以将相关代码添加到问题中。
-
也检查一下这个问题,我以不同的方式解决了它stackoverflow.com/questions/58232606/…
-
DiffUtil 使用 Eugene W. Myers 的差异算法来计算将一个列表转换为另一个列表的最小更新次数。简而言之,该算法在两个不同的列表上运行。 DiffUtil 由 AsyncListDiffer 使用,它在后台线程中运行算法并更新主线程上的回收器视图。 AsyncListDiffer 维护一个列表本身作为前一个列表容器,因此如果我们想要 Diffutils 的最佳性能,我们必须提供一个新的列表实例。
标签: android kotlin listadapter