Android 是否允许使RecyclerView中的项的onClick侦听器作用于onBindViewHolder期间实例化的局部变量?

Android 是否允许使RecyclerView中的项的onClick侦听器作用于onBindViewHolder期间实例化的局部变量?,android,android-recyclerview,Android,Android Recyclerview,我不确定这是否是允许的,或者它有时会使非预期的项目被使用 假设我有一个固定的数据: final String[] items = {"a", "b", "c"}; 我的RecyclerView适配器的项数等于该数据大小: @Override public int getItemCount() { return items.size(); } 然后绑定数据并设置onClickListener: @Override public void onBindViewHolder(final R

我不确定这是否是允许的,或者它有时会使非预期的项目被使用

假设我有一个固定的数据:

final String[] items = {"a", "b", "c"};
我的RecyclerView适配器的项数等于该数据大小:

@Override
public int getItemCount() {
    return items.size();
}
然后绑定数据并设置onClickListener:

@Override
public void onBindViewHolder(final RecyclerView.ViewHolder holder, final int position) {
    final String item = items[position];
    holder.textView.setText(item);
    holder.itemView.setOnClickListener(v -> Log.d(TAG, "Item " + item + " was clicked!"); // 1
}
我的问题是标记为
//1
的行是否正确。还是我必须这样做

holder.itemView.setOnClickListener(v -> Log.d(TAG, "Item " + items[holder.getAdapterPosition()] + " was clicked!"); 
从:

请注意,与ListView不同,如果项在数据集中的位置发生更改,则RecyclerView不会再次调用此方法,除非项本身无效或无法确定新位置。因此,在获取此方法中的相关数据项时,应仅使用position参数,而不应保留其副本。如果以后需要项目的位置(例如在单击侦听器中),请使用getAdapterPosition(),它将更新适配器位置


根据此描述,在
OnClickListener
中,最好使用
getAdapterPosition()
,因为项目的位置在运行时可能会更改。无论如何,他们建议在需要值“以后”时使用
getAdapterPosition()
(如在
OnClickListener
中),因此这可能是最好的方法。

如果在适配器本身中实现
OnClickListener
,并使用
holder.itemView.setOnClickListener(此)
原因是性能。如果我在适配器上实现标记为
//1
@Enzokie的行,我看不出有任何问题。我如何知道位置?如果您查看onClick,它将返回一个
视图
实例(在您的情况下,实际上是itemView!)。视图可以容纳一个对象,并且它有setters和getter方法,例如
setTag
getTag
,如果您愿意,我可以通过Teamviewer帮助您。@Enzokie如何使用setTag和getTag来了解视图位置比将onClickListener设置为上面示例中的匿名类实例具有更好的性能?