如何执行检查复选框单击整个 recyclerview 行

How to perform a check in checkbox clicking on entire recyclerview row

现在我会注册每个复选框,每次按下复选框时都这样

 inner class OrdersInnerViewHolder(itemView: View): BaseViewHolder<Cart>(itemView){
        override fun bind(item: Cart, position: Int) {

            itemView.checkBox.setOnCheckedChangeListener { buttonView, isChecked ->
                item.isChecked = isChecked
                if(isChecked){
                 map.put(position,true)
                }else{
                    map.remove(position,true)
                }
            }
        }
    }

我打算单击整行来选中或取消选中我的项目,现在我知道如何在整行上执行单击但不知道如何设置选中的已更改侦听器

 inner class OrdersInnerViewHolder(itemView: View): BaseViewHolder<Cart>(itemView){
            override fun bind(item: Cart, position: Int) {

            itemView.setOnClickListener { 
                //How to perform checkbox check and uncheck clicking on the entire row instead of the checkbox ?
            }
                itemView.checkBox.setOnCheckedChangeListener { buttonView, isChecked ->
                    item.isChecked = isChecked
                    if(isChecked){
                     map.put(position,true)
                    }else{
                        map.remove(position,true)
                    }
                }
            }
        }

由于复选框具有已选中的侦听器,因此在单击整个视图时我无法与之交互

我计划让我的用户单击复选框以及整行 select 或取消select 此复选框

XML

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    xmlns:tools="http://schemas.android.com/tools"
    android:weightSum="3"
    android:orientation="horizontal">

    <CheckBox
        android:id="@+id/checkBox"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

    <TextView
        android:id="@+id/item_name"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:layout_marginBottom="16dp"
        android:text="Test " />

    <TextView
        android:id="@+id/item_qty"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:layout_weight="1"
        android:text="Qty: 2" />

    <TextView
        android:id="@+id/item_price"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:layout_weight="1"
        tools:text="0.00"/>

</LinearLayout>

有什么想法吗?

将 OnClickListener 添加到切换 CheckBox 的父视图。 OnCheckedChangeListener 仍将被调用以响应父视图的点击侦听器更改选中状态:

itemView.setOnClickListener {
    itemView.checkBox.isChecked = !itemView.checkBox.isChecked
}

要使父视图的外观和行为正确,您可以将它们添加到 XML 中的元素:

android:background="?android:attr/selectableItemBackground"
android:clipToPadding="false"
android:focusable="true"

IIRC,将 OnCheckedChangeListener 添加到 CheckBox 会自动使其可点击。您可能会考虑在设置侦听器后立即设置 itemView.checkBox.isClickable = false,这样即使您点击 CheckBox,您的整个列表项也会显示涟漪效果。

旁注:不要忘记在 onBindView 中设置 CheckBox 的初始状态:

itemView.checkBox.isChecked = item.isChecked

滚动到屏幕时会出现不可预测的状态,否则!

首先在 LinearLayout 中添加 id 然后在 java

中声明

然后根据我的修改你的代码:

inner class OrdersInnerViewHolder(itemView: View): BaseViewHolder<Cart>(itemView){
            override fun bind(item: Cart, position: Int) {

            itemView.setOnClickListener { 
                //How to perform checkbox check and uncheck clicking on the entire row instead of the checkbox ?
            }
                linearLayout.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            if(itemView.checkBox.isChecked){
                map.put(position,true)
            }else{
                map.remove(position,true)
            }
        }
    });
                }
            }
        }