Android——RecyclerView——ViewHolder全部源码及翻译、注释

本文详细介绍了 Android RecyclerView 中 ViewHolder 的内部实现,包括其作用、属性和标志位的用途,例如:持有一个item的元数据、状态标志(如是否可回收、已更新、被移除等)、ViewHolder 的生命周期方法等。通过对源码的解读,有助于理解 RecyclerView 的工作原理。
摘要由CSDN通过智能技术生成

看了rv的源码 知道了他有 viewholder、动画类、自己定义的layoutparams类,recycler类等。


viewHolder:相当于就是一个item,只不过建了这样一个类,去维护这个item,以及view的全部元数据。


//内部维护1个item,在oncreateviewholder中,每次都是不一样的itemview

public final View itemView;

WeakReference<RecyclerView>mNestedRecyclerView;//维护一个嵌套rv的弱引用?

int mPosition = NO_POSITION;//当前位置

int mOldPosition = NO_POSITION;//老的位置

long mItemId = NO_ID;//item id指的是他的资源id

int mItemViewType = INVALID_TYPE;// ItemViewType是什么?

int mPreLayoutPosition = NO_POSITION;//上一个LayoutPosition

 

//已经隐藏的item的holder,在一个item改变的事件和动画?

ViewHolder mShadowedHolder = null;

//正在隐藏的item的holder,在一个item改变的事件和动画?

ViewHolder mShadowingHolder = null;

 

//左移运算符:左移0位,不翻倍,还是1

 

//标识:是ViewHolder已经绑定一个position(元数据:mPosition, mItemId andmItemViewType)

static final int FLAG_BOUND = 1 << 0;

 

//标识:更新

//这个ViewHolder的视图反映的数据是陈旧的,需要由adapter为他重新绑定view。mPosition和mItemId是一致的。

static final int FLAG_UPDATE = 1 <<1;

 

//标识:不可用

//这个ViewHolder的数据是无效的。 mPosition和mItemId所暗示的身份

不被信任,可能不再与项目视图类型相匹配。这个ViewHolder必须完全被重新绑定到不同的数据。

static final int FLAG_INVALID = 1 <<2;

 

//标识:已被移除

//这个ViewHolder指向的数据表示从之前的项目数据集中删除的item。 它的视图仍然可以用于出场(outgoing)动画等。

static final int FLAG_REMOVED = 1 <<3;

 

//标识:不可被回收(重复利用)

//这个ViewHolder不应该被回收。这个标志是通过setIsRecyclable()方法被设置的,

并且这个标志是被打算用来维持views大约在动画期间。(所以应该是在动画期间的时候,这个item是被设置成这个状态,为了防止出错)

static final int FLAG_NOT_RECYCLABLE = 1<< 4;

 

//标识:从废品中被返回

//这个ViewHolder是从废品中返回的,这意味着我们期待着一个addView()方法的调用

把这个itemView重新加入回去。当从废品中返回的时候,如果ViewHolder没有被添加回RecyclerView(意思就是没有从废品堆里出来),ViewHolder会待在废品列表里直到这个布局的底部pass(意思就是那个被隐藏的item显示出来了),再通过recyclerView被回收出来

static final int FLAG_RETURNED_FROM_SCRAP =1 << 5;

 

//标识:使某个ViewHolder被置为不可操作状态

//这个ViewHolder是完全被LayoutManager管理的,(意思就是所有的item在recyclerView中的排列方式是由LayoutManager管理的。比如是LinearLayoutManager,那RecyclerView就好像一个LinerLayout,如果是GridManager(我也记不清叫啥了),那就像是网格状的)

(接下来是忽略的意思)我们不会使这个viewholder报废,被回收,被移除,除非这个LayoutManager被替换掉了(不太明白被替换是什么意思,应该理解为是这个item被移出可见区域的这个操作)。此外,这个ViewHolder仍然完全可见对于这个LayoutManager。

static final int FLAG_IGNORE = 1 <<7;

 

//标识:被移除

//当这个view被从父viewgroup中分离出来时,我们设置这个标志。我们设置这个标志是为了我们可以采取正确的行动当我们需要移除这个viewholder或者把他添加回去。

static final int FLAG_TMP_DETACHED = 1<< 8;

 

//标识:Adapter位置未知

//当我们不能确定这个ViewHolder的适配器的位置时,我们设置这个标识。直到这个ViewHolder被重新绑定到新的位置,我们取消这个标志。这个标识不同于FLAG_INVALID,因为FLAG_INVALID即使在类型不匹配(?)的时候也可以被设置。此外,我们这个标志是当Adapter的通知到达时立即被设置的。而FLAG_INVALID是在布局被重新计算之前被懒惰地设置。

static final intFLAG_ADAPTER_POSITION_UNKNOWN = 1 << 9;

 

//标识:Adapter被(?)完全更新了

//当addChangePayload(null)这个方法被调用的时候&#

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值