@DanKadd

Kotlin: Как обновить RecyclerView при изменении данных?

Добрый день. Есть ReciclerView, который заполняется из Firebase. Функция onChangeListener вызывается в методе OnCreate в активити.
private fun onChangeListener(chatReference: DatabaseReference) {
        chatReference.addValueEventListener(object : ValueEventListener {
            override fun onDataChange(snapshot: DataSnapshot) {
                for(s in snapshot.children) {
                    val chat = s.getValue(chat::class.java)
                    if (chat !== null)chatList.add(chat)
                }
                chatRV.adapter = ChatAdapter(chatList, this@ChatsActivity)

            }

            override fun onCancelled(error: DatabaseError) {

            }
        })
    }

ChatAdapter:
class ChatAdapter(private val chatList: ArrayList<chat>, private val activity: ChatsActivity): RecyclerView.Adapter<ChatAdapter.ChatViewHolder>() {

    inner class ChatViewHolder(itemView: View): RecyclerView.ViewHolder(itemView), View.OnClickListener {
        val imageView: ImageView = itemView.findViewById(R.id.chat_img)
        val nameView: TextView = itemView.findViewById(R.id.chat_name)
        val descriptionView: TextView = itemView.findViewById(R.id.chat_description)
        val removeChat: ImageButton = itemView.findViewById(R.id.remove_chat)
        init {
            removeChat.setOnClickListener(this)
        }
        override fun onClick(p0: View?) {
            val position = adapterPosition
            val chatId = chatList[position].id.toString()
            if (position != RecyclerView.NO_POSITION) {
                activity.onClickRemove(chatId, position)
            }
        }
    }

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ChatViewHolder {
        val view: View = LayoutInflater.from(parent.context).inflate(R.layout.chat_item, parent, false)
        return ChatViewHolder(view)
    }

    override fun onBindViewHolder(holder: ChatViewHolder, position: Int) {
        val chat = chatList[position]
        holder.nameView.text = chat.name
        holder.descriptionView.text = chat.description
        Picasso.get().load(chat.image).into(holder.imageView)

        holder.itemView.setOnClickListener {
            val intent = Intent(activity, MainActivity::class.java)
            intent.putExtra("chatId", chat.id)
            intent.putExtra("chatName", chat.name)
            activity.startActivity(intent)
        }
    }

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


    interface OnItemClickListener {
        fun onClickRemove(chatId: String, position: Int)

    }
}

У меня есть обработчик на клик каждого элемента списка ReciclerView, который удаляет чат. Пытался использовать notifyItemRemoved и notifyDataSetChanged для того, но это не работает.
override fun onClickRemove(id: String, position: Int) {
        var builder = AlertDialog.Builder(this@ChatsActivity)
        builder.setTitle("Подтвердите действие")
        builder.setMessage("Вы точно хотите удалить этот чат?")
        builder.setPositiveButton("Да", DialogInterface.OnClickListener {dialog, i ->
            chatRef.child(id).removeValue() // Удаляю нужный чат из Firebase
            chatList.removeAt(position) // Удаляю чат из списка 
            chatRV.adapter!!.notifyItemRemoved(position) // Эта строчка кода не работает (ReciclerView не обновляется)

            Toast.makeText(this@ChatsActivity, "Чат удален", Toast.LENGTH_SHORT).show()
            dialog.cancel()
        })

        builder.setNegativeButton("Нет", DialogInterface.OnClickListener {dialog, i ->
            dialog.cancel()
        })
        var alert = builder.create()
        alert.show()

    }

Подскажите пожалуйста в чем может быть моя ошибка или что я делаю не так? Возможно ReciclerView нужно уведомлять об обновлении данных прям в адаптере? Заранее спасибо.
  • Вопрос задан
  • 385 просмотров
Пригласить эксперта
Ответы на вопрос 2
Скорее всего chatList в активити, из которого ты удаляешь элемент, и chatList в адаптере - это разные независимые списки. Вот и не обновляется ничего.

Сделай chatList в адаптере публичным и обновляй его.
Ответ написан
Steel_Balls
@Steel_Balls
Если у тебя MVVM, то через LiveData
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы