1,如果想在Recycler View里直接获取:
可以把接口的方法写在:
@Override
public void onBindViewHolder(IndexViewHolder holder, int position) {
super.onBindViewHolder(holder, position);
}
方法里面,用position参数,
2,如果想写在ViewHolder里面,则调用getAdapterPosition()方法:
@Override
public <T> void initUIData(T t) {
IndexBean indexBean = (IndexBean) t;
indexTextView.setText(indexBean.getIndexTitle());
indexTextView.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View view) {
itemIndexClickListener.onItemindexClick(view, getAdapterPosition());
}
});
}
注:
由于需要在Adapter里处理item的点击事件,所以获取Item位置有个方法:
getAdapterPosition()
但是由于RecyclerView的ViewHolder存在回收机制,所以item位置会不准确;
解决方法有:
a、标记不回收;
viewHolder.setIsRecyclable(false)
这样直接“阉割”了RecyclerView最大的特点, 十分不推荐
b、重写方法:
@Override
public int getItemViewType(int position) {
return position;
}
@Override
public long getItemId(int position) {
return position;
}
再正常用getAdapterPosition()就可以了
还有别的方法
原文链接:https://blog.csdn.net/LyamAL/article/details/99655184
注:RecyclerView中获取Item位置的两种方法
public final int getAdapterPosition() {
if (mOwnerRecyclerView == null) {
return NO_POSITION;
}
return mOwnerRecyclerView.getAdapterPositionFor(this);
}
public final int getLayoutPosition() {
return mPreLayoutPosition == NO_POSITION ? mPosition : mPreLayoutPosition;
}
getAdapterPosition()返回ViewHolder中当前展示的Adapter的位置。getLayoutPosition返回的是最新的Layout的位置信息。二者在一般情况下,获取的结果是一致的。
有一种情况,在notifyDataSetChanged()操作的时候,Adapter中数据的更新和Layout布局的更新会有先后的时间差,当Adapter数据更新了,但是Layout布局却还没有刷新,通过getAdapterPostion和getLayoutPosition或者的结果就会有差异。
RececlerView在Layout遍历之前不会去处理Adapter的更新,所以这就会造成实际看到的Layout的数据和Adapter中实际的数据是有差异的。不过,好在这个时间差一般不会超过16ms,所以视觉上一般是没有影响的,但是如果这个时候希望通过getAdapterPostion()得到的返回值为NO_POSITION(-1),在使用这个结果的时候,可能需要做异常处理,否则可能会出现ArrayIndexOutOfBoundsException的异常。
在Adapter数据更新之后,只有在布局重新遍历之后,Layout的位置信息才会更新。在此之前,通过getLayoutPosition()获取的位置信息,是更新布局之前的位置信息,所以通过getLayoutPosition获取的结果有可能是脏数据。
参考:https://blog.csdn.net/suyimin2010/article/details/84502075