Android:将 setOnclickListener 或 setOnLongClickListener 放在 onBindViewHolder 中是否正确?
Android : is correct put setOnclickListener or or setOnLongClickListener in onBindViewHolder?
我可以将 setOnclickListener 或 setOnLongClickListener 放在 onBindViewHolder 中吗?
这个方法onBindViewHolder
写的没问题? (明智与否?)
还是ViewHolder
写的更好?
public void onBindViewHolder(ViewHolder holder, int position) {
myBtn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
//...
}
}); }
这种方法对RecyclerView列表的速度有不好的影响吗?
ViewHolders 基本上是您的 View 对象的缓存和 RecyclerView 的内部类。
由于 RecyclerView.Adapter 是抽象的,您必须实现这三个方法:
public VH onCreateViewHolder(ViewGroup parent, int viewType)
public void onBindViewHolder(VH holder, int position)
public int getItemCount()
您可以结合使用 RecyclerView.OnItemTouchListener 和手势检测来识别这些事件。
您可以在自定义适配器实现中添加侦听器。它将类似于:
public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.ViewHolder> {
public interface OnItemClickListener {
public void onItemClicked(int position);
}
public interface OnItemLongClickListener {
public boolean onItemLongClicked(int position);
}
private Fragment mFragment;
public static class ViewHolder extends RecyclerView.ViewHolder {
public View v;
public ViewHolder(View v) {
super(v);
this.v = v;
}
}
public RecyclerViewAdapter(Fragment fragment) {
mFragment = fragment;
}
@Override
public void onBindViewHolder(ViewHolder holder, final int position) {
holder.v.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mFragment.onItemClicked(position);
}
});
holder.v.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
mFragment.onItemLongClicked(position);
return true;
}
});
}
. . .
}
将它添加到您的 onCreateViewHolder 方法中,这样您就不会扰乱侦听器对象。您应该使用 vh.getAdapterPosition
将其映射回您的数据。
我可以将 setOnclickListener 或 setOnLongClickListener 放在 onBindViewHolder 中吗?
这个方法onBindViewHolder
写的没问题? (明智与否?)
还是ViewHolder
写的更好?
public void onBindViewHolder(ViewHolder holder, int position) {
myBtn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
//...
}
}); }
这种方法对RecyclerView列表的速度有不好的影响吗?
ViewHolders 基本上是您的 View 对象的缓存和 RecyclerView 的内部类。
由于 RecyclerView.Adapter 是抽象的,您必须实现这三个方法:
public VH onCreateViewHolder(ViewGroup parent, int viewType) public void onBindViewHolder(VH holder, int position) public int getItemCount()
您可以结合使用 RecyclerView.OnItemTouchListener 和手势检测来识别这些事件。
您可以在自定义适配器实现中添加侦听器。它将类似于:
public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.ViewHolder> {
public interface OnItemClickListener {
public void onItemClicked(int position);
}
public interface OnItemLongClickListener {
public boolean onItemLongClicked(int position);
}
private Fragment mFragment;
public static class ViewHolder extends RecyclerView.ViewHolder {
public View v;
public ViewHolder(View v) {
super(v);
this.v = v;
}
}
public RecyclerViewAdapter(Fragment fragment) {
mFragment = fragment;
}
@Override
public void onBindViewHolder(ViewHolder holder, final int position) {
holder.v.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mFragment.onItemClicked(position);
}
});
holder.v.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
mFragment.onItemLongClicked(position);
return true;
}
});
}
. . .
}
将它添加到您的 onCreateViewHolder 方法中,这样您就不会扰乱侦听器对象。您应该使用 vh.getAdapterPosition
将其映射回您的数据。