我可以在 运行 时间在 onClickListener 和 onLongClickListener 之间切换吗?

Can I switch between onClickListener and onLongClickListener on the run time?

我为 RecyclerView 适配器的 ViewHolder class 中的项目添加了 OnClickListener 和 OnLongClickListener

这个想法基本上是,当我想要 select 一个项目时,我应该第一次长按它然后我应该做一个正常的短按 select 其他项目

以下是viewholder长按和普通点击界面的代码 接口将由片段的 class 实现,接口的方法将被覆盖。如代码所示,我根据 MultipleSelectionOn(这是一个布尔变量)制作了在长按和正常点击 linstener 之间变化的 if 条件。但是,当我长按该项目时,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);

}

初始化 ViewHolder 时,您应该同时设置 onClickListeneronLongClickListener

public DevicesViewHolder(...) {
    ...

    itemView.setOnLongClickListener(this);
    itemView.setOnClickListener(this);
}

首先初始化setOnLongClickListenersetOnClickListener。对于这个动作,你可以通过多种方式做到这一点 -

  1. 创建一个在用户长按时与 recyclerView 项目重叠的视图。它将模仿项目的选择。并且还拿了一个像isSelected这样的标志。当用户长按一个项目时,标志的值将被改变。在 setOnClickListener 中添加一个条件,如果 isSelected 不等于 true 则在点击侦听器中执行任何操作。标志 isSelected 将在适配器中。

  2. 您可以将 isSelected 放入 recyclerView 实现的模态 class 中。并在 setOnLongClickListener 中相应地将其值更新为 truefalse。然后在 setOnClickListener 中添加一个条件,如果 isSelected 不等于 true 则执行点击监听器中的任何内容。但是这次你使用 isSelected 的值与那个特定位置的模态对象 class 关联。

你可以这样做

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

    }
}