[英]ListAdapter Click event issue using android data-binding + Kotlin + ViewModel
我刚开始使用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)
}
}
}
有人可以帮我解决我的问题。 如果有关代码/项目的任何其他信息,请告诉我。
提前致谢
您可以像这样设置ViewModel的监听器
interface YourViewModel {
fun itemClicked()
}
class YourViewModelImpl : YourViewModel {
override fun itemClicked() {
// your code after clicked
}
}
然后你的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="viewModel"
type="YourViewModel" />
<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="@{() -> viewModel.itemClicked(shoppingListName)}">
<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>
然后你只需要在viewHolder中为dataBinding设置你的监听器
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.