由于新的支持库版本(22.x),getPosition()
类的RecyclerView.ViewHolder
方法已被弃用,而不是主题中提到的方法。我并没有真正理解阅读文档。
有人可以解释外行人的条款差异吗?
我有以下用例 - 我给我的适配器List
,并且还希望能够为每个列表项关联额外信息。我有一个位置到额外的映射,并且映射可供持有者使用,以便他们可以获取额外的位置并用它做事。在持有人中,我应该使用哪种方法?
当指数0和1的列表项目是切换位置时,持有者位置会发生什么?这些方法会返回什么?
答案 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。 。