Могу ли я переключаться между onClickListener и onLongClickListener во время выполнения?

Я добавил OnClickListener и OnLongClickListener для элемента в классе ViewHolder адаптера RecyclerView.

Идея заключается в том, что когда я хочу выбрать элемент, я должен долго щелкнуть по нему в первый раз, а затем сделать обычный короткий щелчок, чтобы выбрать другие элементы.

Ниже приведен код держателя представления с интерфейсами для длинного щелчка и обычного щелчка. Интерфейсы будут реализованы классом фрагмента, а метод интерфейсов будет переопределен. Как видно из кода, я создаю условие if, которое изменяется между длинным щелчком и обычным щелчком мыши в соответствии с MultipleSelectionOn (это логическая переменная). Однако, когда я нажимаю длинный щелчок по элементу, переменная MultipleSelectionOn изменяется на true, но onClickListner не выполняется.

public class DevicesViewHolder extends RecyclerView.ViewHolder implements View.OnLongClickListener, View.OnClickListener{

    LinearLayout device_item_layout;
    TextView title,status;
    ImageView deleteIcon, selectionBtn;

    OnItemClick onItemClick;
    OnItemLongClick onItemLongClick;

    public DevicesViewHolder(@NonNull View itemView, OnItemClick onItemClick, OnItemLongClick onItemLongClick) {
        super(itemView);

        device_item_layout = itemView.findViewById(R.id.device_item);
        title = itemView.findViewById(R.id.title);
        status = itemView.findViewById(R.id.status);
        deleteIcon = itemView.findViewById(R.id.deleteIcon);
        selectionBtn = itemView.findViewById(R.id.selectionBtn);

        this.onItemClick = onItemClick;
        this.onItemLongClick = onItemLongClick;

        if(MultipleSelectionOn == false) {
            itemView.setOnClickListener(null);
            itemView.setOnLongClickListener(this);
        }else{
            itemView.setOnLongClickListener(null);
            itemView.setOnClickListener(this);
        }

    }

    @Override
    public boolean onLongClick(View view) {

        Log.i("MultipleSelectionOn ", String.valueOf(MultipleSelectionOn));

        onItemLongClick.onItemLongClick(getAdapterPosition(), view);

        MultipleSelectionOn = true;

        return true;
    }

    @Override
    public void onClick(View view) {

        Log.i("MultipleSelectionOn ", String.valueOf(MultipleSelectionOn));

        onItemClick.onItemClick(getAdapterPosition(), view);

    }
}



public interface OnItemLongClick{

    void onItemLongClick(int position, View view);

}

public interface OnItemClick{

    void onItemClick(int position, View view);

}

person alosime musaed    schedule 02.07.2020    source источник


Ответы (3)


Сначала инициализируйте как setOnLongClickListener, так и setOnClickListener. И для действия есть несколько способов сделать это -

  1. Создайте представление, которое перекрывает элемент recyclerView, когда пользователь долго нажимает на него. Это будет имитировать выбор элемента. А также взять флаг типа isSelected. Значение флага будет изменено, когда пользователь долго нажимает на элемент. Добавьте условие в setOnClickListener, что если isSelected не равно true, то выполнить что-либо внутри прослушивателя кликов. Флаг isSelected будет в адаптере.

  2. Вы можете взять этот isSelected и поместить его в модальный класс, реализованный recyclerView. А в setOnLongClickListener обновить его значение до true или false соответственно. А затем добавьте условие в setOnClickListener, что если isSelected не равно true, то выполнить что-либо внутри прослушивателя кликов. Но на этот раз вы используете значение isSelected, связанное с объектом модального класса в этой конкретной позиции.

person Ashutosh Sagar    schedule 02.07.2020
comment
Спасибо, ваш ответ решил это! но я не понял второй момент, что такое модальный класс? - person alosime musaed; 02.07.2020
comment
Я имел в виду, предположим, что у вас есть List<User>, который вы передали адаптеру. Таким образом, каждый элемент списка, т.е. User имеет такой же флаг, как isSelected. И по умолчанию это будет false для каждого элемента в списке. - person Ashutosh Sagar; 03.07.2020

При инициализации вашего ViewHolder вы должны установить как onClickListener, так и onLongClickListener

public DevicesViewHolder(...) {
    ...

    itemView.setOnLongClickListener(this);
    itemView.setOnClickListener(this);
}
person Linh    schedule 02.07.2020
comment
Я удалил здесь условия if (MultipleSelectionOn == false) { itemView.setOnClickListener(null); itemView.setOnLongClickListener (это); }else{ itemView.setOnLongClickListener(null); itemView.setOnClickListener (это); } но теперь я могу выбрать элемент, используя обычный щелчок и длинный щелчок, и это не та идея, которую я хочу, идея заключается в том, что я должен сначала щелкнуть долгим щелчком по элементу, а затем я могу просто щелкнуть обычный щелчок по любому другому элементу, чтобы сделать это выбранным - person alosime musaed; 02.07.2020

вы можете сделать это таким образом

public interface OnItemLongClick {

    void onItemLongClick(int position, View view);

}


public interface OnItemClick {

    void onItemClick(int position, View view);

}

public class DevicesViewHolder extends RecyclerView.ViewHolder implements View.OnLongClickListener, View.OnClickListener {

    LinearLayout device_item_layout;
    TextView title, status;
    ImageView deleteIcon, selectionBtn;

    OnItemClick onItemClick;
    OnItemLongClick onItemLongClick;

    public DevicesViewHolder(@NonNull View itemView, OnItemClick onItemClick, OnItemLongClick onItemLongClick) {
        super(itemView);

        device_item_layout = itemView.findViewById(R.id.device_item);
        title = itemView.findViewById(R.id.title);
        status = itemView.findViewById(R.id.status);
        deleteIcon = itemView.findViewById(R.id.deleteIcon);
        selectionBtn = itemView.findViewById(R.id.selectionBtn);

        this.onItemClick = onItemClick;
        this.onItemLongClick = onItemLongClick;
        itemView.setOnLongClickListener(this);
        itemView.setOnClickListener(this);

    }

    @Override
    public boolean onLongClick(View view) {

        Log.i("MultipleSelectionOn ", String.valueOf(MultipleSelectionOn));

        onItemLongClick.onItemLongClick(getAdapterPosition(), view);

        MultipleSelectionOn = true;

        return true;
    }

    @Override
    public void onClick(View view) {

        Log.i("MultipleSelectionOn ", String.valueOf(MultipleSelectionOn));
        if (MultipleSelectionOn) {
            onItemClick.onItemClick(getAdapterPosition(), view);
        }

    }
}
person sourabh karmakar    schedule 02.07.2020
comment
Мне нужно поставить условие, чтобы setOnClickListener не выполнялся в первый раз, когда я нажимаю обычный щелчок по элементу, идея состоит в том, что я должен сначала щелкнуть длинный щелчок по элементу, а затем я могу просто щелкнуть обычный щелчок по любому другому элементу чтобы его выбрали - person alosime musaed; 02.07.2020