Первое, о чем нужно подумать, нужен ли для этого прослушиватель щелчков.Событие click должно быть поглощено CheckBox
, и, следовательно, прослушиватель click, вероятно, не нужен.Кроме того, setOnCheckedChangeListener
должен быть установлен один раз для CheckBox
, а не для клика и не для User
элементов.
Поскольку вы не показали нам GroupAdapter
или ViewHolder
реализацию, поэтому я просто подошелс одной возможной реализацией:
GroupAdapter.kt
class GroupAdapter: RecyclerView.Adapter<GroupAdapter.ViewHolder>() {
private val db = FirebaseFirestore.getInstance()
private var users: List<User> = ArrayList() // Store user list here
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
val inflater = LayoutInflater.from(parent.context)
val itemView = inflater.inflate(R.layout.yourViewHolderLayout, parent, false)
return ViewHolder(itemView)
}
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
if (users.size > position)
holder.bindTo(users[position])
else
holder.clear()
}
override fun getItemCount() = users.size
// Update the user list
fun submitUsers(users: List<User>) {
this.users = users
notifyDataSetChanged()
}
inner class ViewHolder(view: View): RecyclerView.ViewHolder(view) {
private val _checkBox_select: CheckBox = view.findViewById(R.id.yourCheckBoxId)
private val _textView_anwesenheitsliste_username = view.findViewById(R.id.yourTextBoxId)
private val checkedChangeListener =
CompoundButton.OnCheckedChangeListener { view, isChecked ->
val uid = users[adapterPosition].uid
if (uid != null) {
if (isChecked) {
db.collection("users").document(uid)
.update("isSelected", true)
} else {
db.collection("users").document(uid)
.update("isSelected", false)
}
}
}
// bind to user here
fun bindTo(user: User) {
if (!user.prfileImageUrl!!.isEmpty()) {
Picasso.get().load(user.prfileImageUrl)
.into(_imageView_show_anwesenheitsliste_row)
}
_textView_anwesenheitsliste_username.text = user.username
_checkBox_select.setOnCheckedChangeListener(null)
_checkBox_select.isChecked = (user.isSelected == true)
_checkBox_select.setOnCheckedChangeListener(checkedChangeListener)
}
// clear
fun clear() {
_textView_anwesenheitsliste_username.text = ""
_checkBox_select.setOnCheckedChangeListener(null)
}
}
}
Тогда вы можете использовать этот адаптер в своей деятельности следующим образом:
val db = FirebaseFirestore.getInstance()
val adapter = GroupAdapter()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_perform_anwesenheitsliste)
_recyclerView_show_anwesenheitsliste.adapter = adapter
showUsersAndPerformChekBoxes()
}
private fun showUsersAndPerformChekBoxes() {
db.collection("users")
.get()
.addOnSuccessListener { documents ->
val users = documents.map { doc -> doc.toObejct(User::Class.java) }
adapter.submitUsers(users)
}
}
Вещи могут не работать сразутак как я не тестировал код.
Дальнейшие улучшения
Если вам интересно, подумайте об этих сценариях: что делать, если слишком много пользователей, которых приложение не можетполучить весь список сразу?Что делать, если несколько телефонов используют одно и то же приложение и пытаются обновить список одновременно?Что делать, если есть проблема с сетью?Что произойдет, если пользователь спамит флажок x9999 раз?
Решения для этих проблем не тривиальны, поэтому я не отвечаю здесь, но это хорошая практика, чтобы подумать о крайних случаях и как приложение должно реагировать наэти сценарии.