Android:在onBindViewHolder中输入setOnclickListener或setOnLongClickListener是否正确?

时间:2015-06-30 16:57:07

标签: android view android-recyclerview android-viewholder

我可以在onBindViewHolder中放置setOnclickListener或setOnLongClickListener吗?

这个方法onBindViewHolder写的没问题? (是否明智?)

或者ViewHolder写得更好吗?

public void onBindViewHolder(ViewHolder holder, int position) {


    myBtn.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {
            //...
        }
    }); }

此方法对RecyclerView列表的速度有不良影响吗?

2 个答案:

答案 0 :(得分:6)

在onCreateViewHolder方法上添加它,这样就不会流失监听器对象。您应该使用vh.getAdapterPosition将其映射回您的数据。

答案 1 :(得分:0)

ViewHolders基本上是View对象的缓存和RecyclerView的内部classe。

由于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;
        }
    });
}
. . .

}