26

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

起初它看起来像是一个很酷的工具来显示列表,通过数据绑定,将它们添加xmlRecyclerView. 为此,我制作了一个这样的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:items来更新它的项目。RecyclerViewMyAdapter

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

所以我想实现的逻辑是:

  1. 我从一个空的开始MyAdapter
  2. 当从我的 API 中获取我的项目时,我会实例化一个ObservableArrayList包装它们并将其传递给binding
  3. 数据绑定调用我BindingAdapter将项目传递给MyAdapter
  4. MyAdapter收到新项目时,它会清除旧项目并在收到的项目中添加一个OnListChangedCallbackObservableList处理微更改
  5. 如果 , 中有任何变化ObservableListMyAdapter将相应地改变而不完全刷新
  6. 如果我想显示一组完全不同的相同项目类型,我可以重新设置binding变量,因此BindingAdapter将再次调用并且MyAdapter项目将完全改变。

例如,如果我想显示Game我有两个不同列表的类型的项目:“拥有的游戏”和“愿望清单游戏”,我可以调用binding.setItems(whateverItems)以完全刷新显示的项目,但是例如,如果我移动“愿望清单”游戏”围绕列表进行按相关性进行组织,每个列表中只会执行微小的更改,而不会刷新整个列表。

BindingAdapter事实证明这个想法是不可行的,因为每次对 a 进行一次更改时,数据绑定都会重新执行ObservableList,因此例如我观察到休闲行为:

  1. 我从一个空的开始MyAdapter
  2. 当从我的 API 中获取我的项目时,我会实例化一个ObservableArrayList包装它们并将其传递给binding
  3. 数据绑定调用我BindingAdapter将项目传递给MyAdapter
  4. MyAdapter收到新项目时,它会清除旧项目并在收到的项目中添加一个OnListChangedCallbackObservableList处理微更改
  5. 如果 中发生任何变化ObservableListBindingAdapter则再次调用 ,从而再次MyAdapter接收整个列表并完全刷新。

这种行为对我来说似乎很糟糕,因为它阻止了ObservableList在 data-bound 中可用xml。我无法认真找出这种行为是可取的合法案例。

我查了一些例子:here and this other SO question

在第一个链接中,所有示例都ObservableList直接使用了Adapter,甚至没有传递表单xml和实际数据绑定,而在 SO 答案中链接的代码中,开发人员基本上做了我尝试做的事情,添加:

if (this.items == items){
        return;
}

在他开始时,他Adapter.setItems(ObservableList<T> items)丢弃了所有由于ObservableList.

这种行为的需要是什么?在哪些情况下可能需要这种行为?我觉得ObservableList这是一个添加到数据绑定的功能,并且非常有用,除非与实际数据绑定一起使用,在这种情况下,它会迫使你保护它的行为。List如果我在xml数据标签和签名中都将它声明为简单BindingAdapter,那么我可以将它转换回ObservableList内部MyAdapter并且它工作得很好,但这是一个非常糟糕的黑客攻击。如果它只是数据绑定的一个单独功能,而不是在每次更改时触发绑定,我认为它会好得多。

4

1 回答 1

1

根据文档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

于 2017-04-25T13:19:25.193 回答