Firestore) как обновить recyclerview после обновления поля данных

#firebase #google-cloud-firestore

#firebase #google-облако-firestore

Вопрос:

У меня есть recyclerview и есть одна кнопка.
Эта кнопка может изменять логическое состояние с true на false, false на true.
И я хочу изменить цвет фона кнопки в соответствии с ее логическим состоянием.

Ниже приведен мой код

 class ProjectFeedBigAdapter : ListAdapter<Project, ProjectFeedBigAdapter.ProjectFeedBigViewHolder>(
    ProjectFeedDiffUtil()
) {
    val db: FirebaseFirestore = FirebaseFirestore.getInstance()
    val projects: ArrayList<Project> = arrayListOf()

    init {
        db.collection("projects")
            .orderBy("timeStamp", Query.Direction.DESCENDING)
            .addSnapshotListener { querySnapshot, exception ->
                projects.clear()

                if(querySnapshot == null) return@addSnapshotListener

                for(snapshot in querySnapshot.documents) {
                    val project = snapshot.toObject(Project::class.java)
                    projects.add(project!!)
                }
                submitList(projects)
            }
    }

    override fun onCreateViewHolder...{...}

    override fun onBindViewHolder(holder: ProjectFeedBigViewHolder, position: Int) {
        val item = getItem(position)

        holder.apply {
            when(item.booleanState) {
                true -> {
                    // Button BackgroundColor Change
                }
                else -> {
                    // Button BackgroundColor Change
                }
            }

            stateButton.setOnClickListener {
                val project = db.collection("projects").document(item.projectId)

                item.booleanState?.let {
                    project
                        .update("booleanState", !it)
                        .addOnSuccessListener { Toast.makeText(//context, "Success", Toast.LENGTH_SHORT).show() }
                        .addOnFailureListener { e ->  }
                }
            }
        }

    }

    inner class ProjectFeedBigViewHolder(private val view: View): RecyclerView.ViewHolder(view) {
    ...
    }
}


class ProjectFeedDiffUtil: DiffUtil.ItemCallback<Project>() {
    override fun areItemsTheSame(oldItem: Project, newItem: Project): Boolean {
        return oldItem.timeStamp == newItem.timeStamp
    }

    override fun areContentsTheSame(oldItem: Project, newItem: Project): Boolean {
        return oldItem == newItem
    }

}
  

когда я нажимаю «stateButton»,

  1. Происходят логические изменения состояния. (Я вижу, что данные меняются в облаке Firebase)
  2. Кроме того, вы можете видеть, что передаете submitList().
  3. Но не вводите onBindViewHolder, чтобы цвет фона stateButton не менялся.

Как я могу решить эту проблему?

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

1. вы должны уведомить свой адаптер о том, что данные изменились с помощью notifyDataSetChanged()

2. это неправильный способ обновления, как указано в Ashish answer, ‘notifyDataSetChanged ()’ обновляет весь список. Итак, если у вас есть 10 данных, он перезагрузит весь список. Не рекомендуется делать это, если ваши данные обновляются с высокой частотой. Если это только очень маленький список, возможно, вы можете использовать его для продолжения своей работы.