RecyclerView.ViewHolder - getLayoutPosition vs getAdapterPosition

wuj*_*jek 79 android android-recyclerview

由于新的支持库版本(22.x暂时)的getPosition()的方法RecyclerView.ViewHolder类已被否决代替的主题中提到的方法.我并没有真正理解阅读文档.有人可以解释外行人的条款差异吗?

我有以下用例 - 我给我的适配器a List,并且还希望能够为每个列表项关联额外信息.我有一个位置到额外的映射,并且映射可供持有者使用,以便他们可以获取额外的位置并用它做事.在持有人中,我应该使用哪种方法?

当指数0和1的列表项切换位置时,​​持有者位置会发生什么?这些方法返回了什么?

yig*_*git 105

这是一个棘手的情况,抱歉文档是不够的.

当适配器内容更改(并且您调用notify***())时,RecyclerView请求新布局.从那时起,直到布局系统决定计算新布局(<16 ms),布局位置和适配器位置可能不匹配,因为布局尚未反映适配器更改.

在您的使用案例中,由于您的数据与适配器内容相关(并且我假设数据在适配器更改的同时更改),您应该使用adapterPosition.

但请注意,如果您正在调用notifyDataSetChanged(),因为它会使所有内容无效,则在计算下一个布局之前,RecyclerView不知道ViewHolder的适配器位置.在那种情况下,getAdapterPosition()将返回RecyclerView#NO_POSITION(-1).

但是,让我们说如果你已经打过电话notifyItemInserted(0),getAdapterPosition()以前在位的ViewHolder 01立即开始返回.因此,只要您调度粒度通知事件,您就始终处于良好状态(即使尚未计算新布局,我们也知道适配器位置).

另一个例子,如果你在用户点击上做某事,如果getAdapterPosition()返回NO_POSITION,最好忽略该点击,因为你不知道用户点击了什么(除非你有其他一些机制,例如稳定的ID来查找项目).

编辑布局位置良好时

假设您正在使用LinearLayoutManager并希望在当前单击的项目上方访问ViewHolder.在这种情况下,您应该使用布局位置来获取上面的项目.

mRecyclerView.findViewHolderForLayoutPosition(myViewHolder.getLayoutPosition() - 1)
Run Code Online (Sandbox Code Playgroud)

您必须使用布局位置,因为它与用户当前在屏幕上看到的内容相匹配.

  • 您应该使用传递给onBind方法的position参数. (5认同)