Android中获取RecyclerView的position的位置的方法

1,如果想在Recycler View里直接获取:
可以把接口的方法写在:

    @Override
    public void onBindViewHolder(IndexViewHolder holder, int position) {
        super.onBindViewHolder(holder, position);

    }

方法里面,用position参数,
2,如果想写在ViewHolder里面,则调用getAdapterPosition()方法:

        @Override
        public  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

你可能感兴趣的:(Android中获取RecyclerView的position的位置的方法)