RecyclerView中获取Item位置的两种方法

转载自: RecyclerView中获取Item位置的两种方法

RecyclereView中有两种方法获取当前Item位置信息的时候,有两种方法,分别是getAdapterPosition()方法和getLayoutPosition()方法,二者对应的源码分别如下:

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获取的结果有可能是脏数据。

猜你喜欢

转载自blog.csdn.net/IO_Field/article/details/79171639