我应该在哪里将setOnClickListener放在RecyclerView适配器中

在互联网上的教程中,他们在RecyclerView的Adapter中设置了OnClickListener,它们以两种方式定义它:在ViewHolder内部或在BindViewHolder内部。

我的问题是哪一个是更好的方法,请推荐任何其他方法(如果有的话)

1)在ViewHolder中:

public static class ViewHolder extends RecyclerView.ViewHolder { public ViewHolder(View itemView) { super(itemView); tvSrc = (TextView) itemView.findViewById(R.id.tvSrc); itemView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(v.getContext(), "inside viewholder position = " + getAdapterPosition(), Toast.LENGTH_SHORT).show(); } }); } 

2)在BindViewHolder中

 public void onBindViewHolder(DisplayTrainsAdapter.ViewHolder viewHolder, final int position) { viewHolder.tvSrc.setText(mDataset.get(position).strSrc); viewHolder.tvSrc.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(v.getContext(), "position = " + getItemId(position), Toast.LENGTH_SHORT).show(); } }); } 

两种选择都有其优点和缺点。

例如,如果单击一个Button并且您想要更改按钮的文本,那么您应该使用在ViewHolder中设置onClick侦听器的选项。 除此之外,它还使您的代码看起来更干净。

但是,如果单击按钮,您想要在与单击的按钮相同的索引/位置更改TextView的文本,则需要使用在onBindViewHolder方法中设置onClick侦听器的选项。

您提出的1号解决方案是最好的解决方案,因为在通过..()方法触发的每个invalidate中,不会在Binding中调用该赋值。 我也知道其他解决方案但你需要在你的活动中实现android.view.GestureDetector。

如果您希望对适配器进行其他改进,请查看我的FlexibleAdapter https://github.com/davideas/FlexibleAdapter,并随意在您的项目中实施。

恕我直言:我喜欢1号。

自从您调用new ViewHolder(View)以来,您实际上在实际显示内容之前设置了new ViewHolder(View) 。 这很好,因为在调用onBindView时,你的onClickListener已经在你的视图上设置了。

我认为它也是在构造函数ViewHolder(View)执行此操作的更ViewHolder(View)代码

ViewHolder()我想,因为你定义了什么view被保持以及它内部和其他function。

但是onBindViewHolder()你说在ViewHolder定义的view会有这个文本,这个图像……