我可以在 运行 时间在 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
时,您应该同时设置 onClickListener
和 onLongClickListener
public DevicesViewHolder(...) {
...
itemView.setOnLongClickListener(this);
itemView.setOnClickListener(this);
}
首先初始化setOnLongClickListener
和setOnClickListener
。对于这个动作,你可以通过多种方式做到这一点 -
创建一个在用户长按时与 recyclerView 项目重叠的视图。它将模仿项目的选择。并且还拿了一个像isSelected
这样的标志。当用户长按一个项目时,标志的值将被改变。在 setOnClickListener
中添加一个条件,如果 isSelected
不等于 true
则在点击侦听器中执行任何操作。标志 isSelected
将在适配器中。
您可以将 isSelected
放入 recyclerView 实现的模态 class 中。并在 setOnLongClickListener
中相应地将其值更新为 true
或 false
。然后在 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);
}
}
}
我为 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
时,您应该同时设置 onClickListener
和 onLongClickListener
public DevicesViewHolder(...) {
...
itemView.setOnLongClickListener(this);
itemView.setOnClickListener(this);
}
首先初始化setOnLongClickListener
和setOnClickListener
。对于这个动作,你可以通过多种方式做到这一点 -
创建一个在用户长按时与 recyclerView 项目重叠的视图。它将模仿项目的选择。并且还拿了一个像
isSelected
这样的标志。当用户长按一个项目时,标志的值将被改变。在setOnClickListener
中添加一个条件,如果isSelected
不等于true
则在点击侦听器中执行任何操作。标志isSelected
将在适配器中。您可以将
isSelected
放入 recyclerView 实现的模态 class 中。并在setOnLongClickListener
中相应地将其值更新为true
或false
。然后在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);
}
}
}