Kotlin RecyclerView не обновляется после изменения данных

#kotlin #android-recyclerview

#kotlin #android-recyclerview

Вопрос:

Я использую RecyclerView для отображения динамического списка данных, и после вызова API мне нужно обновить пользовательский интерфейс RecyclerView, но элементы в моем RecyclerView не меняются…

Ниже показано, как я инициализирую свой 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
        }
    }
}
 

В настоящее время я обновляю свой RecyclerView из класса SmsHelper, как показано ниже:-

 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()
                    }
                }
            }
 

Комментарии:

1. можете ли вы добавить код, в который вы на самом деле вызываете adapter.notifyDataSetChanged() , пожалуйста?

2. Привет, я отредактировал и добавил код

Ответ №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
}