RecyclerView Adapter:为什么onLongClick方法与onClick冲突? [英] RecyclerView Adapter: why does onLongClick method conflict with onClick?
问题描述
在我的RecyclerView的适配器文件中,在onCreateViewHolder方法中设置了一个OnClickListener.它工作正常,当单击RecyclerView列表中的某个项目时,它将启动一个新活动.我正在尝试为将运行其他方法的项目的LongClick添加一个OnLongClickListener.
In my RecyclerView's adapter file I have an OnClickListener set in the onCreateViewHolder method. It is working correctly, which is to launch a new activity when an item in the RecyclerView list is clicked on. I am trying to add an OnLongClickListener for a LongClick on the item that will run a different method.
当我添加如下所示的setOnLongClickListener部分和onLongClick方法时,RecyclerView列表中的项目无法正确显示,因此视图中的某些内容必须不正确.我在这里想念什么?
When I add the setOnLongClickListener section and onLongClick method shown below, then the items in the RecyclerView list don't show properly so something with the views must not be correct. What am I missing here?
适配器文件:
public class ContactListAdapter extends RecyclerView.Adapter<ContactListAdapter.ContactHolder>{
private RecyclerItemClickListener recyclerItemClickListener;
...
@Override
public ContactHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_contact_item, parent, false);
final ContactHolder contactHolder = new ContactHolder(view);
contactHolder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
int adapterPos = contactHolder.getAdapterPosition();
if (adapterPos != RecyclerView.NO_POSITION) {
if (recyclerItemClickListener != null) {
recyclerItemClickListener.onItemClick(adapterPos, contactHolder.itemView);
}
}
}
});
contactHolder.itemView.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View view) {
int adapterPos = contactHolder.getAdapterPosition();
if (adapterPos != RecyclerView.NO_POSITION) {
if (recyclerItemClickListener != null) {
recyclerItemClickListener.onItemLongClick(adapterPos, contactHolder.itemView);
}
}
return false;
}
});
return contactHolder;
}
public void setOnItemClickListener(RecyclerItemClickListener recyclerItemClickListener) {
this.recyclerItemClickListener = recyclerItemClickListener;
}
侦听器文件:
public interface RecyclerItemClickListener {
void onItemClick(int position, View view);
void onItemLongClick(int position, View v);
}
活动文件:
...
@Override
public void onItemClick(int position, View view) {
ActActivity.start(this, contactListAdapter.getItem(position));
}
@Override
public void onItemLongClick(int position, View v) {
Toast toast = Toast.makeText(this, "Test", Toast.LENGTH_LONG);
toast.setGravity(Gravity.CENTER_VERTICAL, 0, 0);
toast.show();
}
推荐答案
在bindViewHolder方法内部实现onClickListener和onLongClickListener,或者可以选择在定义的视图持有者类中实现它.它应该可以解决您的问题.
Implement onClickListener and onLongClickListener inside bindViewHolder method or optionally implement it in view holder class defined. It should solve your issue.
public class CustomViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener, View.OnLongClickListener {
public CustomViewHolder(View itemView) {
super(itemView);
itemView.setOnLongClickListener(this);
itemView.setOnClickListener(this);
}
@Override
public boolean onLongClick(View view) {
int adapterPos = getAdapterPosition();
if (adapterPos != RecyclerView.NO_POSITION) {
if (recyclerItemClickListener != null) {
recyclerItemClickListener.onItemLongClick(adapterPos, contactHolder.itemView);
}
}
return false;
}
@Override
public void onClick(View view) {
int adapterPos = getAdapterPosition();
if (adapterPos != RecyclerView.NO_POSITION) {
if (recyclerItemClickListener != null) {
recyclerItemClickListener.onItemClick(adapterPos, contactHolder.itemView);
}
}
}
}
}
这篇关于RecyclerView Adapter:为什么onLongClick方法与onClick冲突?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!