繁体   English   中英

ListAdapter使用android数据绑定+ Kotlin + ViewModel点击事件问题

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM