【发布时间】:2019-06-20 09:40:44
【问题描述】:
我刚开始使用 kotlin lang 进行 Android 开发,并遇到了下面提到的代码问题
在 Kotlin 中使用带有数据绑定的 Android ListAdapter 时无法获取点击事件。
源代码:
list_item_shopping_list_name.xml:
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<data>
<variable
name="clickListener"
type="android.view.View.OnClickListener" />
<variable
name="shoppingListName"
type="com.vp.shoppinglist.database.entity.ShoppingListName" />
</data>
<com.google.android.material.card.MaterialCardView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="8dp"
android:layout_marginLeft="16dp"
android:layout_marginTop="70dp"
android:layout_marginRight="16dp"
android:layout_marginBottom="16dp"
android:onClick="@{clickListener}">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#FFFFFF"
android:orientation="vertical">
<com.google.android.material.textfield.TextInputLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<com.google.android.material.textfield.TextInputEditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:focusable="false"
android:text="@{shoppingListName.name}" />
</com.google.android.material.textfield.TextInputLayout>
</LinearLayout>
</com.google.android.material.card.MaterialCardView>
</layout>
适配器代码:
class ShoppingListNameAdapter(var context: Context) :
ListAdapter<ShoppingListName, ShoppingListNameAdapter.ViewHolder>(ShoppingListNameDiffCallback()) {
private val TAG = javaClass.simpleName
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
var inflater = LayoutInflater.from(parent.context)
var binding = ListItemShoppingListNameBinding.inflate(inflater, parent, false)
return ViewHolder(binding)
}
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
getItem(position).let { shoppingListName ->
holder.apply {
bind(createOnClickListener(shoppingListName), shoppingListName)
itemView.tag = holder
}
}
}
class ViewHolder(var binding: ListItemShoppingListNameBinding) : RecyclerView.ViewHolder(binding.root) {
fun bind(listener: View.OnClickListener, item: ShoppingListName) {
binding.apply {
with(binding) {
clickListener = listener
shoppingListName = item
executePendingBindings()
}
}
}
}
private fun createOnClickListener(shoppingListName: ShoppingListName): View.OnClickListener {
return View.OnClickListener {
Log.e("Click", "==========OnClickListener")
Toast.makeText(context, "Clicked : ${shoppingListName.name}", Toast.LENGTH_LONG).show()
}
}
class ShoppingListNameDiffCallback : DiffUtil.ItemCallback<ShoppingListName>() {
override fun areItemsTheSame(oldItem: ShoppingListName, newItem: ShoppingListName): Boolean {
return oldItem.name == newItem.name
}
override fun areContentsTheSame(oldItem: ShoppingListName, newItem: ShoppingListName): Boolean {
return oldItem.equals(newItem)
}
}
}
谁能帮我解决我的问题。如果需要有关代码/项目的任何其他信息,请告诉我。
提前致谢
【问题讨论】:
标签: android kotlin android-databinding