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

     

     

  • 相关阅读:
    tcp socket
    Spring MVC 复习笔记01
    Spring 复习笔记01
    mybatis 复习笔记03
    ActiveMQ实现负载均衡+高可用部署方案(转)
    JVM复习笔记
    JAVA NIO复习笔记
    java IO复习笔记
    并发编程复习笔记
    杂记复习笔记
  • 原文地址:https://www.cnblogs.com/charles04/p/7427887.html
Copyright © 2011-2022 走看看