zoukankan      html  css  js  c++  java
  • 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获取的结果有可能是脏数据。

     

     

  • 相关阅读:
    uva 1374 快速幂计算
    uva 1343 非原创
    uva 11212
    uva 10603
    路径寻找问题……!
    bzoj 1008: [HNOI2008]越狱
    bzoj 1010: [HNOI2008]玩具装箱toy
    dp斜率优化小计
    bzoj 1002[FJOI2007]轮状病毒
    hihocoder #1114
  • 原文地址:https://www.cnblogs.com/charles04/p/7427887.html
Copyright © 2011-2022 走看看