我正在为我的RecyclerView checkbox
设置侦听器。单击checkbox
时,它应该在数据库中将该项目标记为收藏夹。但是即使没有点击,听众也会自己被调用。
这是Recyclerview
class KafanaAdapter(private val kafani: List<Kafana>, private val listener: OnItemClickListener) :
RecyclerView.Adapter<KafanaAdapter.KafanaViewHolder>() {
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): KafanaViewHolder {
val inflater = LayoutInflater.from(parent.context)
val binder = ItemKafanaBinding.inflate(inflater, parent, false)
return KafanaViewHolder(binder, listener)
}
override fun onBindViewHolder(holder: KafanaViewHolder, position: Int) {
holder.bind(kafani[holder.adapterPosition])
}
override fun getItemCount(): Int {
return kafani.size
}
class KafanaViewHolder constructor(private val binder: ItemKafanaBinding, private val listener: OnItemClickListener) : RecyclerView.ViewHolder(binder.root) {
fun bind(kafana: Kafana) {
binder.kafana = kafana
binder.tvKafanaTitle.text = kafana.name
binder.tvKafanaAddress.text = kafana.address
binder.ivCall.setOnClickListener { listener.onKafanaClicked(kafana) }
binder.checkBox.setOnCheckedChangeListener { _, isChecked ->
kafana.isFavorite = isChecked
listener.onKafanaFavoriteClicked(kafana)
}
}
}
interface OnItemClickListener {
fun onKafanaClicked(kafana: Kafana)
fun onKafanaFavoriteClicked(kafana: Kafana)
}
}
这是我Fragment
中实现接口的部分:
override fun onKafanaFavoriteClicked(kafana: Kafana) {
doAsync {
if (kafana.isFavorite) mViewModel.setFavorite(kafana, 0) else mViewModel.setFavorite(kafana, 1)
uiThread {
toast("Favorite")
}
}
}
如果你研究CompoundButton
小部件(这是Checkbox
的超类(的源代码,你会发现有一个名为setChecked(boolean)
的方法调用提供的CheckedChangeListener
。
现在,setChecked()
由CompoundButton
本身在不同的时间调用 - 当小部件的实例状态恢复时,在onInitializeAccessibilityEventInternal()
方法中,在CompoundButton
的构造函数中,等等。
因此,这就是为什么即使您没有点击复选框也会调用侦听器的原因。
您有哪些选择?
- 请改用
OnClickListener
,并检查该方法onClick()
复选框是否已选中。 - 使用
CheckedChangedListener
并在onCheckedChanged()
方法中调用checkbox.isPressed()
方法,以确定它是否是用户发起的更改。 - 编写您自己的
Checkbox
类版本(可能基于 Android SDK 中的版本(,除非确定更改发生在用户单击复选框后,否则不会调用此侦听器。