#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»,
- Происходят логические изменения состояния. (Я вижу, что данные меняются в облаке Firebase)
- Кроме того, вы можете видеть, что передаете submitList().
- Но не вводите onBindViewHolder, чтобы цвет фона stateButton не менялся.
Как я могу решить эту проблему?
Комментарии:
1. вы должны уведомить свой адаптер о том, что данные изменились с помощью
notifyDataSetChanged()
2. это неправильный способ обновления, как указано в Ashish answer, ‘notifyDataSetChanged ()’ обновляет весь список. Итак, если у вас есть 10 данных, он перезагрузит весь список. Не рекомендуется делать это, если ваши данные обновляются с высокой частотой. Если это только очень маленький список, возможно, вы можете использовать его для продолжения своей работы.