Как установить флажок, нажав на всю строку recyclerview - PullRequest
1 голос
/ 05 мая 2020

Теперь я регистрирую каждый щелчок по флажку каждый раз, когда нажимаю на этот флажок

 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)
                    }
                }
            }
        }

Поскольку у флажка есть проверенный прослушиватель, у меня нет возможности взаимодействовать с ним при щелчке всего представления

I планирую разрешить моему пользователю устанавливать или снимать этот флажок, а также всю строку

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="$100.00"/>

</LinearLayout>

Есть идеи?

Ответы [ 2 ]

1 голос
/ 05 мая 2020

Добавьте OnClickListener к родительскому представлению, которое переключает CheckBox. OnCheckedChangeListener по-прежнему будет вызываться в ответ на то, что прослушиватель кликов родительского представления изменит отмеченное состояние: *:

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

IIR C, добавление OnCheckedChangeListener в CheckBox автоматически делает его интерактивным. Вы можете рассмотреть возможность установки itemView.checkBox.isClickable = false сразу после установки слушателя, чтобы весь ваш элемент списка отображал эффект пульсации, даже если вы нажмете на CheckBox.

Боковое примечание: не забудьте установить начальное состояние CheckBox в onBindView:

itemView.checkBox.isChecked = item.isChecked

Он будет иметь непредсказуемое состояние при прокрутке на экране, в противном случае!

0 голосов
/ 05 мая 2020

Сначала добавьте идентификатор в свой LinearLayout, затем объявите затем в 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)
            }
        }
    });
                }
            }
        }
...