我有一个RecyclerView,每个列表项中都有两个Button和一个TextView,当我从ViewModel中单击一个Button时,我试图更新TextView文本,但是它不起作用。我该怎么办?
这里是list_item.xml,我正在使用数据绑定从ViewModel设置TextView的文本。
<LinearLayout
....
<Button
android:id="@+id/minus_button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="@{() -> minusBtnClickListener.onBtnClick(menuItem)} />
<TextView
android:id="@+id/quantity_text_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{viewModel.quantity.toString()}" />
<Button
android:id="@+id/plus_button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="@{() -> plusBtnClickListener.onBtnClick(menuItem)}" />
</LinearLayout>
这里是Adapter.kt文件,我尝试将clicklisteners添加到适配器中以获取被单击项的位置。是否有更好的方法来获取单击的列表项按钮的位置并相应地更新其文本?
class MenuAdapter(
private val plusClickListener: PlusBtnClickListener,
private val minusClickListener: MinusBtClickListener,
private val viewModel: ViewModel
) :
ListAdapter<MenuItem, MenuAdapter.MenuViewHolder>(DiffCallback) {
....
override fun onBindViewHolder(holder: MenuViewHolder, position: Int) {
val item = getItem(position)
holder.bind(
item!!,
plusClickListener,
minusClickListener,
viewModel
)
}
inner class MenuViewHolder(private var binding: ListItemBinding) :
RecyclerView.ViewHolder(binding.root) {
fun bind(
menuItem: MenuItem
plusClickListener: PlusButtonClickListener,
minusClickListener: MinusButtonClickListener,
viewModel: ViewModel
) {
binding.viewModel = viewModel
binding.minusClickListener = minusClickListener
binding.plusClickListener = plusClickListener
binding.menuItem = menuItem
binding.executePendingBindings()
}
}
class PlusBtnClickListener(val plusClickListener: (quantity: Int) -> Unit) {
fun onButtonClick(menuItem: MenuItem) = plusClickListener(menuItem.quantity)
}
class MinusButtonClickListener(val minusClickListener: (quantity: Int) -> Unit) {
fun onButtonClick(menuItem: MenuItem) = minusClickListener(menuItem.quantity)
}
}
这里是ViewModel文件
private val _quantity = MutableLiveData<Int>()
val quantity: LiveData<Int>
get() = _quantity
init {
_quantity.value = 0
}
fun onPlusButtonClick() {
_quantity.value = (quantity.value)?.plus(1)
}
fun onMinusButtonClick() {
_quantity.value = (quantity.value)?.minus(1)
}
这是Fragment.kt文件。如何在片段中实现按钮单击?
val adapter = MenuAdapter(
MenuAdapter.PlusBtnClickListener {
viewModel.onPlusButtonClick()
},
MenuAdapter.MinusBtnClickListener {
viewModel.onMinusButtonClick()
},
viewModel = viewModel
)
binding.menuList.adapter = adapter
如果问题的任何部分似乎不清楚,请告诉我。
更改
android:onClick="@{() -> minusBtnClickListener.onBtnClick(menuItem)
to
android:onClick="@{(view) -> minusBtnClickListener.onBtnClick(menuItem)