其他分享
首页 > 其他分享> > android – ListAdapter不更新reyclerview中的项目

android – ListAdapter不更新reyclerview中的项目

作者:互联网

我正在使用新的支持库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

有人能帮我一下吗?

解决方法:

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

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

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

如果它无法处理同一列表中的更改,我真的不明白这个ListAdapter的重点.如果要更改列表中的项目,请传递给ListAdapter并查看更改,然后您需要创建列表的深层副本,或者需要使用常规的RecyclerView和您自己的DiffUtill类.

标签:android,kotlin,listadapter
来源: https://codeday.me/bug/20190927/1822699.html