Добрый день. Есть 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 нужно уведомлять об обновлении данных прям в адаптере? Заранее спасибо.