如何使用DataBinding处理RecyclerView中每个列表项的按钮单击

问题描述 投票:0回答:1

我有一个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 android-fragments mvvm android-recyclerview android-architecture-components
1个回答
0
投票

更改

android:onClick="@{() -> minusBtnClickListener.onBtnClick(menuItem)

to

android:onClick="@{(view) -> minusBtnClickListener.onBtnClick(menuItem)
© www.soinside.com 2019 - 2024. All rights reserved.