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设置为上面示例中的匿名类实例具有更好的性能?