android - ListAdapter 未更新 RecyclerView 中的项目

标签 android kotlin listadapter

我正在使用新的支持库 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 时,它不会重新渲染已更改的 View 。

它会在我滚动列表时重新渲染 View ,然后调用 bindView()

另外,我注意到在提交列表之后调用 adapter.notifyDatasSetChanged() 会使用更新的值呈现 View ,但我不想调用 notifyDataSetChanged() 因为列表适配器内置了 diff utils

有人可以帮我吗?

最佳答案

编辑:我理解为什么会发生这种情况,这不是我的意思。我的观点是,它至少需要发出警告或调用 notifyDataSetChanged() 函数。因为显然我调用 submitList(...) 函数是有原因的。我很确定人们会在几个小时内试图弄清楚出了什么问题,直到他们发现 submitList() 默默地忽略了调用。

这是因为 Google 的怪异逻辑。因此,如果您将相同的列表传递给适配器,它甚至不会调用 DiffUtil

public void submitList(final List<T> newList) {
    if (newList == mList) {
        // nothing to do
        return;
    }
....
}

如果这个 ListAdapter 不能处理同一个列表上的更改,我真的不明白它的全部意义。如果您想更改传递给 ListAdapter 的列表中的项目并查看更改,那么您需要创建列表的深拷贝,或者您需要使用常规 RecyclerView 与您自己的 DiffUtill 类。

关于android - ListAdapter 未更新 RecyclerView 中的项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49726385/

相关文章:

android - 如何支持多屏维度

android - 如何使您的 TextView 背景透明?

android - 使用 Robolectric 运行 Android 测试 - 依赖错误

android - 如何从 assets 文件夹中的 HTML 文件访问 drawable 文件夹中的图像?

android - 如何在 Android 版 Google Filament 中设置背景颜色?

android - 从自定义 listView Android 中的项目更新 textView

java - 使用静态函数有哪些陷阱?就像这段 Android 代码一样

android - 使用多个数据源填充 Android ListView(使用加载器)

java - 队列上的 NoSuchElementException

android - 带有 Dagger 2 的不同范围的单个实例