RecyclerView监听器自己被调用

时间:2018-01-03 20:16:05

标签: android android-recyclerview kotlin

我正在为我的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")
        }
    }

}

1 个答案:

答案 0 :(得分:1)

如果你研究CompoundButton小部件的源代码(这是Checkbox的超类),你会发现有一个名为setChecked(boolean)的方法调用提供的CheckedChangeListener

现在,setChecked()本身在不同时间调用CompoundButton - 当小部件的实例状态在onInitializeAccessibilityEventInternal()方法中恢复时,在CompoundButton中构造函数等。

所以,这就是为什么即使你没有点击复选框也会调用监听器。

你有哪些选择?

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