Установка onClickListener для всего элемента в onBindViewHolder - PullRequest
1 голос
/ 07 февраля 2020

У меня есть RecyclerView Adapter, и я хочу установить onClick для всего элемента, но этот код, и когда я также попробовал его с myViewHolder.view.setOnClickListener(..), оба все еще только слушали щелчок флажка.

Как мне установить onClickListener на все item?

public class DeliveryPointSelectionAdapter extends RecyclerView.Adapter<DeliveryPointSelectionAdapter.MyViewHolder> {
    private static final String TAG = MyViewHolder.class.getSimpleName();
    private List<DeliveryPoint> deliveryPointList;

    interface OnItemCheckListener {
        void onItemCheck(DeliveryPoint deliveryPoint);
        void onItemUncheck(DeliveryPoint deliveryPoint);
    }

    @NonNull
    private OnItemCheckListener onItemCheckListener;

    public DeliveryPointSelectionAdapter(List<DeliveryPoint> deliveryPointList, @NonNull OnItemCheckListener onItemCheckListener) {
        this.deliveryPointList = deliveryPointList;
        this.onItemCheckListener = onItemCheckListener;
    }

    @NonNull
    @Override
    public DeliveryPointSelectionAdapter.MyViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int viewType) {
        View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.dialog_select_deliverypoints_to_change_item, viewGroup, false);
        return new MyViewHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull MyViewHolder myViewHolder, int i) {
        DeliveryPoint deliveryPoint = deliveryPointList.get(i);
        myViewHolder.tvFormattedString.setText(deliveryPoint.domesticAddress.formattedString);
        myViewHolder.checkBox.setChecked(deliveryPoint.isCheckedForLocationUpdate);

        myViewHolder.linearLayout.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                DeliveryPoint deliveryPoint1 = deliveryPointList.get(myViewHolder.getAdapterPosition());
                if (myViewHolder.checkBox.isChecked()) {
                    deliveryPoint1.setCheckedForLocationUpdate(true);
                    onItemCheckListener.onItemCheck(deliveryPoint1);
                } else {
                    deliveryPoint1.setCheckedForLocationUpdate(false);
                    onItemCheckListener.onItemUncheck(deliveryPoint1);
                }
            }
        });

//        myViewHolder.checkBox.setOnCheckedChangeListener((buttonView, isChecked) -> {
//            DeliveryPoint deliveryPoint1 = deliveryPointList.get(myViewHolder.getAdapterPosition());
//            if (myViewHolder.checkBox.isChecked()) {
//                deliveryPoint1.setCheckedForLocationUpdate(true);
//                onItemCheckListener.onItemCheck(deliveryPoint1);
//            } else {
//                deliveryPoint1.setCheckedForLocationUpdate(false);
//                onItemCheckListener.onItemUncheck(deliveryPoint1);
//            }
//        });
    }

    @Override
    public int getItemCount() {
        return deliveryPointList.size();
    }

    @Override
    public int getItemViewType(int position){
        return position;
    }

    public static class MyViewHolder extends RecyclerView.ViewHolder {
        TextView tvFormattedString;
        CheckBox checkBox;
        LinearLayout linearLayout;
        View view;

        MyViewHolder(View view) {
            super(view);
            tvFormattedString = (TextView) view.findViewById(R.id.tv_formatted_string);
            checkBox = view.findViewById(R.id.cb_deliverypoint_checked);
            linearLayout = view.findViewById(R.id.ll_delivery_points_layout);
            this.view = view;
        }
    }
}

Элемент Макет просмотра:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/ll_delivery_points_layout"

    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="horizontal">

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

        <TextView
            android:id="@+id/tv_formatted_string"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:gravity="center_vertical"
            android:paddingStart="25dp"
            android:paddingTop="15dp"
            android:paddingEnd="25dp"
            android:textColor="@color/gray_text_light"
            android:textSize="18sp"

            tools:ignore="RtlSymmetry" />
    </LinearLayout>
</LinearLayout>

Ответы [ 3 ]

2 голосов
/ 07 февраля 2020

Firslty создает переменную OnItemClickListener следующим образом:

public class DeliveryPointSelectionAdapter extends RecyclerView.Adapter<DeliveryPointSelectionAdapter.MyViewHolder> {
    private OnItemClickListener listener;

Затем, в нижней части кода класса, реализуйте метод setOnItemClickListener

    public void setOnItemClickListener(OnItemClickListener
                                       listener){
this.listener = listener;

}

Также (к концу код вашего класса) вы должны создать новый интерфейс, который будет описывать данные, которые будут генерировать действие при нажатии. Примерно так:

public interface OnItemClickListener{
        void OnItemClick(
                int position);

}

Затем попробуйте настроить прослушиватель по щелчку, используя метод, который вы описали в своем вопросе myViewHolder.view.setOnClickListener(..) Но внутри метода MyViewHolder(View view). Примерно так:

      view.setOnClickListener(new View.OnClickListener() {
           @Override
           public void onClick(View v) {
               int position = getAdapterPosition();
if(position !=RecyclerView.NO_POSITION&& listener
        !=null){
    listener.OnItemClick(position);
}

2 голосов
/ 07 февраля 2020

Как и другие пользователи, уже упоминавшиеся myViewHolder.itemView.setOnClickListener, чтобы установить onClick на держатель recyclerView. Но, поправьте меня, если я ошибаюсь, кажется, что вы хотите, чтобы ваш флажок был отмечен / снят только щелчком владельца. В этом случае вам нужно отключить его, добавив следующие коды в ваш макет xml

               android:clickable="false"
               android:focusable="false"
               android:focusableInTouchMode="false"

В противном случае нажатие на флажок приведет к его клику и не выполнит код, который вы написали для itemview клика.

Поскольку вы устанавливаете его на флажок на основе deliveryPoint.isCheckedForLocationUpdate, вы можете notifyItemChanged(position) обновить флажок держателя после щелчка.

Проверьте, помогает ли это.

РЕДАКТИРОВАТЬ : Исходя из комментариев, если вы на самом деле пытаетесь установить флажок в представлении, вы должны использовать что-то вроде этого: также, если вы создаете новый объект deliveryPoint1, в исходный объект, который у вас есть в представлении, не вносятся никакие изменения.

myViewHolder.itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (myViewHolder.checkBox.isChecked()) {
                    deliveryPoint.setCheckedForLocationUpdate(false);
                    onItemCheckListener.onItemUncheck(deliveryPoint);
                } else {
                    deliveryPoint.setCheckedForLocationUpdate(true);
                    onItemCheckListener.onItemCheck(deliveryPoint);
                }
            }
        });
1 голос
/ 07 февраля 2020

Вы пытаетесь установить флажок, если он установлен, и снимите флажок, если он не установлен. Измените условия, например:

            if (myViewHolder.checkBox.isChecked()) {
                deliveryPoint1.setCheckedForLocationUpdate(true);
                onItemCheckListener.onItemCheck(deliveryPoint1);
            } else {
                deliveryPoint1.setCheckedForLocationUpdate(false);
                onItemCheckListener.onItemUncheck(deliveryPoint1);
            }
            notifyItemChanged(myViewHolder.getAdapterPosition());

И не забудьте вызвать notifyDataSetChanged(); на вашем адаптере в методе интерфейса.

...