【问题标题】:Kotlin RecyclerView not updating after data changesKotlin RecyclerView 在数据更改后不更新
【发布时间】:2020-12-14 18:48:31
【问题描述】:

我正在使用 RecyclerView 显示动态数据列表,在调用 api 后,我需要更新我的 RecyclerView UI,但我的 RecyclerView 中的项目没有改变...

以下是我如何在 Fragment 中初始化 RecyclerView:-

forwardedList.layoutManager = LinearLayoutManager(context!!, RecyclerView.VERTICAL, false)
adapter = ForwardListAdapter(SmsHelper.getForwardedSms(context!!))
forwardedList.adapter = adapter

下面是我自定义的 RecyclerView 适配器:-

class ForwardListAdapter(val forwardedList: List<SmsData>) : RecyclerView.Adapter<ForwardListAdapter.ViewHolder>() {

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ForwardListAdapter.ViewHolder {
        val v = LayoutInflater.from(parent.context).inflate(R.layout.forwarded_item, parent, false)
        return ViewHolder(v)
    }

    override fun onBindViewHolder(holder: ForwardListAdapter.ViewHolder, position: Int) {
        holder.bindItems(forwardedList[position])
    }

    override fun getItemCount(): Int {
        return forwardedList.size
    }

    class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
        fun bindItems(sms: SmsData) {
            val simSlotText: TextView = itemView.findViewById(R.id.simSlot)
            val senderText: TextView = itemView.findViewById(R.id.sender)

            simSlotText.text = "[SIM ${sms.simSlot}] "
            senderText.text = sms.sender
        }
    }
}

我目前正在从 SmsHelper 类更新我的 RecyclerView,如下所示:-

val fragments = mainActivity!!.supportFragmentManager.fragments

            for (f in fragments) {
                if (f.isVisible) {
                    if (f.javaClass.simpleName.equals("ForwardedFragment")) {
                        val fg = f as ForwardedFragment
                        fg.adapter.notifyDataSetChanged() <----- HERE
                    } else if (f.javaClass.simpleName.equals("FailedFragment")) {
                        val fg = f as FailedFragment
                        fg.adapter.notifyDataSetChanged()
                    }
                }
            }

【问题讨论】:

  • 你能在你实际调用adapter.notifyDataSetChanged()的地方添加代码吗?
  • 您好,我已经编辑并添加了代码

标签: kotlin android-recyclerview


【解决方案1】:

正如我所观察到的,您并没有真正更改适配器的数据,而只是调用了notifyDataSetChanged。你不能指望数据会像这样自动更改,因为只有notifyDataSetChanged

通知附加的观察者底层数据已更改,任何反映数据集的视图都应自行刷新。

您需要先自己更改数据,然后调用notifyDataSetChanged

class ForwardListAdapter(private val forwardedList: MutableList<SmsData>) : RecyclerView.Adapter<ForwardListAdapter.ViewHolder>() {
    // ...
     
    fun setData(data: List<SmsData>) {
        forwardedList.run {
            clear()
            addAll(data)
        }
    }

    // ...
}

然后这样做:

adapter.run {
    setData(...) // Set the new data
    notifyDataSetChanged(); // notify changed
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-05-19
    • 1970-01-01
    • 2023-03-21
    • 2014-01-23
    • 2011-12-16
    • 1970-01-01
    • 2021-11-24
    • 1970-01-01
    相关资源
    最近更新 更多