RecyclerView.ViewHolder - getLayoutPosition vs getAdapterPosition

时间:2015-04-16 19:23:33

标签: android android-recyclerview

由于新的支持库版本(22.x),getPosition()类的RecyclerView.ViewHolder方法已被弃用,而不是主题中提到的方法。我并没有真正理解阅读文档。 有人可以解释外行人的条款差异吗?

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

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

2 个答案:

答案 0 :(得分:99)

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

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

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

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

但是,如果您已拨打notifyItemInserted(0),则以前位于getAdapterPosition()的ViewHolder的0将立即开始返回1。因此,只要您调度粒状通知事件,您就始终处于良好状态(即使尚未计算新布局,我们也知道适配器位置)。

另一个示例,如果您在用户点击时执行某些操作,如果getAdapterPosition()返回NO_POSITION,则最好忽略该点击,因为您不知道用户点击了什么(除非您有一些其他机制,例如用于查找项目的稳定ID。)

编辑布局位置良好时

假设您使用LinearLayoutManager并想要访问当前点击项目上方的ViewHolder。在这种情况下,您应该使用布局位置来获取上面的项目。

mRecyclerView.findViewHolderForLayoutPosition(myViewHolder.getLayoutPosition() - 1)

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

答案 1 :(得分:0)



为了争辩getAdapterPosition()getLayoutPosition()position的区别;我们会注意到以下情况:

1。position方法中的参数onBindViewHolder()

我们可以使用position将数据绑定到视图,可以使用position参数来执行此操作,但是不能使用position参数来处理用户单击,并且如果您使用过它,则会看到警告,告诉您“不要将position视为固定的,而应使用holder.getAdapterPosition()”。

2。getAdapterPosition()

此方法始终包含适配器的更新位置holder。这意味着,每当您单击某个项目时,您都会向适配器询问其position。因此您将获得根据适配器逻辑的最新信息。

3。getLayoutPosition()

有时,需要根据更新后的布局(用户现在看到的最后一个通过的布局)找到position,例如:如果用户要求输入第三个position他可以看到,并且您将swipe / dismiss用于商品或将动画或装饰物应用于商品,最好使用getLayoutPosition()而不是getAdapterPosition(),因为您总是确保您根据最新通过的布局来处理项目的位置。


有关此的更多信息;参见here。 。