gpt4 book ai didi

Android 数据绑定(bind) ObservableList 行为问题

转载 作者:IT老高 更新时间:2023-10-28 22:10:25 26 4
gpt4 key购买 nike

我发现很难发现 android.databinding.ObservableList 的真正存在理由作为数据绑定(bind)功能。

起初它看起来像一个很酷的显示列表的工具,通过 data binding ,通过 xml 添加它们到 RecyclerView .
为此,我做了一个 BindingAdapter像这样:

@BindingAdapter(value = {"items"}, requireAll = false)
public static void setMyAdapterItems(RecyclerView view, ObservableList <T> items) {
if(items != null && (view.getAdapter() instanceof MyAdapter)) {
((GenericAdapter<T>) view.getAdapter()).setItems(items);
}
}

这样,我可以使用属性 app:itemsRecyclerViewMyAdapter设置为它,以更新其项目。

现在最好的功能 ObservableList是否可以添加 OnListChangedCallback到它,它处理 RecyclerView 中可用的相同事件添加/移动/删除/更改其中的项目,而无需实际重新加载整个列表。

所以我想实现的逻辑是休耕:
  • 我从一个空的 MyAdapter 开始
  • 当我的项目从我的 API 中获取时,我会实例化一个 ObservableArrayList包装它们并将其传递给 binding
  • 数据绑定(bind)调用我的 BindingAdapter将项目传递给 MyAdapter
  • MyAdapter收到新项目,它清除旧项目并添加 OnListChangedCallbackObservableList收到处理微更改
  • 如果在 ObservableList 中发生任何变化, MyAdapter不完全刷新会相应改变
  • 如果我想显示一组完全不同的相同项目类型,我可以重新设置 binding变量,所以 BindingAdapter将再次调用和 MyAdapter项目将完全改变。

  • 例如,如果我想显示 Game 类型的项目我有两个不同的列表:“自有游戏”和“愿望 list 游戏”,我可以拨打 binding.setItems(whateverItems)完全刷新显示的项目,但例如,如果我在列表周围移动“愿望 list 游戏”以按相关性组织它们,则每个列表中只会执行微更改而不会刷新整个内容。

    事实证明这个想法是不可行的,因为数据绑定(bind)重新执行 BindingAdapter每次对 ObservableList 进行单个更改时,所以例如我观察休耕行为:
  • 我从一个空的 MyAdapter 开始
  • 当我的项目从我的 API 中获取时,我会实例化一个 ObservableArrayList包装它们并将其传递给 binding
  • 数据绑定(bind)调用我的 BindingAdapter将项目传递给 MyAdapter
  • MyAdapter收到新项目,它清除旧项目并添加 OnListChangedCallbackObservableList收到处理微更改
  • 如果在 ObservableList 中发生任何变化, BindingAdapter再次被调用,因此 MyAdapter再次接收整个列表并完全刷新。

  • 这种行为对我来说似乎很糟糕,因为它阻止了 ObservableList无法在数据绑定(bind)中使用 xml .我无法认真找出这种行为是可取的合法案例。

    我查了一些例子: herethis other SO question

    在第一个链接中,所有示例都使用了 ObservableList直接到 Adapter甚至没有通过表格 xml和实际的数据绑定(bind),而在 SO 答案中链接的代码中,开发人员做了与我尝试做的基本相同的事情,并补充说:
    if (this.items == items){
    return;
    }

    在他的开头 Adapter.setItems(ObservableList<T> items)由于 ObservableList 中的简单更改而放弃调用该方法的所有情况.

    这种行为的需要是什么?在哪些情况下可能需要这种行为?我觉得 ObservableList是一个与数据绑定(bind)一起添加的功能,非常有用,除非与实际数据绑定(bind)一起使用,在这种情况下,它会迫使您防御其行为。
    如果我将它声明为一个简单的 List在两者 xml数据标签和在 BindingAdapter签名,然后我可以把它投回 ObservableListMyAdapter它工作得很好,但这是一个非常糟糕的黑客。
    如果它只是一个独立于数据绑定(bind)的特性,而不在每次更改时触发绑定(bind),在我看来它会好得多。

    最佳答案

    根据文档中提供的示例 https://developer.android.com/topic/libraries/data-binding/index.html#observable_collections ObservableList 用于使用键整数访问它的项目,即:

    <data>
    <import type="android.databinding.ObservableList"/>
    <import type="com.example.my.app.Fields"/>
    <variable name="user" type="ObservableList&lt;Object&gt;"/>
    </data>

    <TextView
    android:text='@{user[Fields.LAST_NAME]}'
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"/>

    因此,当 ObservableList 内部发生变化时它触发 BindingAdapter 更新 UI。我认为这是使用 ObservableList 的主要目的。现在 DataBinding 处于开发状态。也许将来 DataBinding 会更新为新的 SomeObservableList这将用于 RecyclerView。
    同时,您可以使用 if (this.items == items){return;}如果它适合您,或者重新考虑您使用 ObservableList 的逻辑.

    关于Android 数据绑定(bind) ObservableList 行为问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43249866/

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