回收器视图侦听器自行调用



我正在为我的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的构造函数中,等等。

因此,这就是为什么即使您没有点击复选框也会调用侦听器的原因。

您有哪些选择?

  1. 请改用OnClickListener,并检查该方法onClick()复选框是否已选中。
  2. 使用 CheckedChangedListener 并在 onCheckedChanged() 方法中调用 checkbox.isPressed() 方法,以确定它是否是用户发起的更改。
  3. 编写您自己的 Checkbox 类版本(可能基于 Android SDK 中的版本(,除非确定更改发生在用户单击复选框后,否则不会调用此侦听器。

最新更新