我正在为我的RecyclerView checkbox
设置一个监听器。单击checkbox
时,应将该项标记为DB中的收藏夹。但即使没有点击,听众也会自己被召唤。
这是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")
}
}
}
答案 0 :(得分:1)
如果你研究CompoundButton
小部件的源代码(这是Checkbox
的超类),你会发现有一个名为setChecked(boolean)
的方法调用提供的CheckedChangeListener
。
现在,setChecked()
本身在不同时间调用CompoundButton
- 当小部件的实例状态在onInitializeAccessibilityEventInternal()
方法中恢复时,在CompoundButton
中构造函数等。
所以,这就是为什么即使你没有点击复选框也会调用监听器。
你有哪些选择?
OnClickListener
并检查onClick()
方法中是否选中了复选框。CheckedChangedListener
并调用checkbox.isPressed()
方法中的onCheckedChanged()
方法,以确定是否是用户启动的更改。Checkbox
类版本(可能基于Android SDK中的版本),该版本不会调用此侦听器,除非在用户单击复选框后确定更改已发生。