ViewHolder中的Click监听器有时只响应

时间:2017-11-13 14:51:57

标签: android kotlin kotlin-android-extensions

我有以下代码。下面你可以看到我的viewholder,adapter和我的xml。我遇到的问题是有时不执行点击。只有当我在textview和imageview中的viewholder中设置clicklisteners时才会工作。据推测,textview和imageview会让点击被蚕食。任何人都知道为什么会出现这种情况。

class GeneralListItemViewHolder(val view: View) : RecyclerView.ViewHolder(view) {

   var item: GeneralItemViewModel? = null

   init {
       view.setOnClickListener {
            item?.method?.invoke()
       }
   }

   fun bind(item: GeneralItemViewModel) {
      this.item = item
      //Do some nice UI things
   }
}

我的xml看起来像这样:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
style="@style/ListItem">

<ImageView
    android:id="@+id/general_list_item_icon"
    style="@style/ListItem.Icon"
    android:layout_alignParentStart="true"
    android:layout_centerVertical="true" />

<TextView
    android:id="@+id/general_list_item_title"
    style="@style/ListItem.Labels.Title"
    android:layout_centerVertical="true"
    android:layout_marginStart="@dimen/margin"
    android:layout_toEndOf="@id/general_list_item_icon" />

此外,我的适配器代码包含以下内容:

class GeneralItemAdapter(val items: List<GeneralItemViewModel>) : RecyclerView.Adapter<GeneralListItemViewHolder>() {

   override fun onBindViewHolder(holder: GeneralListItemViewHolder, position: Int) {
       return holder.bind(getItem(position))
   }

   override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): GeneralListItemViewHolder {
       val view = parent.inflate(R.layout.general_list_item, false)
       return GeneralListItemViewHolder(view)
   }

   override fun getItemCount(): Int {
       return items.size
   }

   private fun getItem(position: Int): GeneralItemViewModel {
       return items[position]
   }
}

2 个答案:

答案 0 :(得分:0)

您必须在bind方法中设置ClickListener。

答案 1 :(得分:0)

实际上,问题与在视图上使用合成kotlin扩展有关。如果您在变量视图而不是itemView上使用它们,则单击会被textview吃掉。

fun bind(item: AboutGeneralItemViewModel) {
    this.item = item

    itemView.general_list_item_title.text = item.value
    itemView.setOnClickListener {
        item?.method?.invoke()
    }
}