【问题标题】:updating a listadapter更新列表适配器
【发布时间】:2019-07-31 06:39:09
【问题描述】:

我无法在 android 中更新我的 listAdapter 中的数据

我的适配器:

class Adapter(val viewModel: ConfirmViewModel,
              private val uiDownloadManager: UiDownloadManager)
    : ListAdapter<Comment, RecyclerView.ViewHolder>(MessageListDiffUtil()) {

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
        val viewItem = LayoutInflater.from(parent.context)
                .inflate(R.layout.confirm_comment, parent, false)
        return CommentHolder(viewItem)
    }

    override fun onBindViewHolder(viewHolder: RecyclerView.ViewHolder, position: Int) {
        try {
            viewHolder as CommentHolder
            viewHolder.bind(getItem(position), uiDownloadManager)
        } catch (e: Exception) {
            e.printStackTrace()
        }
    }

}

class MessageListDiffUtil : DiffUtil.ItemCallback<Comment>() {
    override fun areItemsTheSame(p0: Comment, p1: Comment): Boolean {
        return p0.serverId == p1.serverId
    }
    override fun areContentsTheSame(p0: Comment, p1: Comment): Boolean {
        return p0.serverId == p1.serverId
    }
}

更新代码:

val c = Comment()
c.serverId = 5
c.text = "for test"
val l = listOf(c)
adapter.submitList(l)

不要在 recyclerview 中显示任何数据 发生的事情是当适配器第一次调用 submitList 时不呈现所有项目

【问题讨论】:

  • 不,在 ListAdapter 中你不需要使用 notifyDataSetChanged()

标签: android listadapter


【解决方案1】:

我认为这与您的 Diff 项目回调有关尝试添加更多比较而不仅仅是 id。像这样的

class MessageListDiffUtil : DiffUtil.ItemCallback<Comment>() {
    override fun areItemsTheSame(p0: Comment, p1: Comment): Boolean {
        return p0.serverId == p1.serverId && p0.something == p1.something ......
    }
    override fun areContentsTheSame(p0: Comment, p1: Comment): Boolean {
        return p0.serverId == p1.serverId && p0.commentText == p1.commentText .....
    }
}

在某些情况下还需要覆盖 ListAdapter 中的 submitList():

 override fun submitList(list: List<SomeModel>?) {
        if (list != null) {
            super.submitList(ArrayList(list))
        } else {
            super.submitList(null)
        }
    }

【讨论】:

  • 我使用断点到override fun areItemsTheSame(p0: Comment, p1: Comment): Boolean { return p0.serverId == p1.serverId &amp;&amp; p0.something == p1.something ...... },但没有触发
  • areContentsTheSame 怎么样?
  • 天哪,我的 recyclerview 是 null 。在创建我的片段之前,我尝试在视图中找到 recyclerview。谢谢你的帮助
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-22
  • 2018-04-18
  • 1970-01-01
相关资源
最近更新 更多