gpt4 book ai didi

android - 不推荐使用 getAdapterPosition()

转载 作者:行者123 更新时间:2023-12-03 13:25:38 25 4
gpt4 key购买 nike

我更新了我的 targetSdkVersion从 28 到 30,我注意到 getAdapterPosition()已弃用(我不确定何时发生)。
documentation ,他们说:

This method is deprecated.
This method is confusing when adapters nest other adapters. If you are calling this in the context of an Adapter, you probably want to call getBindingAdapterPosition() or if you want the position as RecyclerView sees it, you should call getAbsoluteAdapterPosition().


该文档还说明了以下内容:

Note that if you are querying the position as RecyclerView sees, you should use getAbsoluteAdapterPosition() (e.g. you want to use it to save scroll state). If you are querying the position to access the RecyclerView.Adapter contents, you should use getBindingAdapterPosition().


我的理解是:
  • getBindingAdapterPosition当您想要获取适配器位置时应该使用(如果它仍然存在于适配器中)。如果适配器中不再存在,则返回-1 (NO_POSITION)。
  • getAbsoluteAdapterPosition应该用于获得 RecyclerView 的位置看到它。例如,如果一个项目已被删除,但尚未从 ViewHolder 中删除。 .

  • 换句话说,如果我有 4我的 Adapter 中的项目,我删除位置 0并查询 getAbsoluteAdapterPositiongetBindingAdapterPosition在项目从 ViewHolder 中删除之前,然后 getAbsoluteAdapterPosition将返回 0 (因为 View 仍在 ViewHolder 中)和 getBindingAdapterPosition返回 -1 (因为它不再存在于适配器中)。

    我通过记录以下内容测试了差异:
    Log.e("difference", "getAdapterPosition = "+myHolder.getAdapterPosition()+" getBindingAdapterPosition = "+myHolder.getBindingAdapterPosition()+" getAbsoluteAdapterPosition = "+myHolder.getAbsoluteAdapterPosition());
    它们返回完全相同的值。我看不出有什么不同。
    在调用 notifyItemChanged 之前或之后我也看不出有什么区别, notifyDataSetChangednotifyItemRangeChanged .但是当我删除位置 0并调用 notifyItemRemoved它返回 -1之后(对于所有人)。
    我的问题
    我是否正确理解这一点,我们什么时候应该使用哪个?还有,什么时候会有区别?

    最佳答案

    recyclerview:1.2.0-alpha02介绍了MergeAdapter已重命名为 ConcatAdapter recyclerview:1.2.0-alpha04 .
    这个RecyclerView Adapter 可以结合多个适配器 线性的。
    就像是:

    FirstAdapter adapter1 = ...;
    SecondAdapter adapter2 = ...;
    ConcatAdapter merged = new ConcatAdapter(adapter1, adapter2);
    recyclerView.setAdapter(mergedAdapter);
    作为此更改的一部分,方法 getAdapterPosition() 已弃用,因为当适配器嵌套其他适配器时名称会令人困惑。现在你应该使用方法 getBindingAdapterPosition() 返回 中的位置特定适配器 ( bindingAdapter)。
    还要检查 RecyclerView.ViewHolder 的源代码:
        @Deprecated
    public final int getAdapterPosition() {
    return getBindingAdapterPosition();
    }
    取而代之的是方法 getAbsoluteAdapterPosition() 返回项目相对于 的适配器位置整个 RecyclerView .如果您使用的是 ConcatAdapter它是 ConcatAdapter 中的位置而不是单个 bindingAdapter 中的位置。
    只是一个带有 2 个适配器的示例:
    enter image description here
    更多详细信息,请访问 official blog post .

    关于android - 不推荐使用 getAdapterPosition(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63068519/

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