gpt4 book ai didi

android - RecyclerView.ViewHolder - getLayoutPosition 与 getAdapterPosition

转载 作者:IT老高 更新时间:2023-10-28 13:10:27 24 4
gpt4 key购买 nike

由于新的支持库版本 (22.x),RecyclerView.ViewHolder 类的 getPosition() 方法已被弃用,以代替话题。我并没有真正从阅读文档中得到区别。有人可以用外行的话解释一下区别吗?

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

当索引 0 和 1 的列表项交换位置时,​​持有者位置会发生什么情况?方法返回什么?

最佳答案

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

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

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

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

但是假设你调用了 notifyItemInserted(0),ViewHolder 的 getAdapterPosition() 之前在位置 0 将立即开始返回 1。因此,只要您调度细粒度的通知事件,您就始终处于良好状态(即使尚未计算新布局,我们也知道适配器位置)。

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

在布局位置合适时编辑

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

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

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

关于android - RecyclerView.ViewHolder - getLayoutPosition 与 getAdapterPosition,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29684154/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com