Android数据绑定ObservableList行为问题

我发现很难发现android.databinding.ObservableList作为数据绑定function的真实存在。

起初,它看起来像一个很酷的工具来显示列表,通过数据绑定 ,通过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); } } 

这样,我可以使用设置为MyAdapterRecyclerView的属性app:items来更新其项目。

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

所以我认为要实施的逻辑是:

  1. 我从一个空的MyAdapter开始
  2. 当我从我的API获取我的项目,我实例化一个ObservableArrayList包装他们,并将其传递给binding
  3. 数据绑定调用我的BindingAdapter将项目传递给MyAdapter
  4. MyAdapter接收到新的项目时,清除旧项目, MyAdapter接收到的ObservableList添加一个OnListChangedCallback来处理微变化
  5. 如果ObservableList任何更改,则MyAdapter将相应地更改,而不会完全刷新
  6. 如果我想显示完全不同的一组相同的项目types,我可以重新设置bindingvariables,所以BindingAdapter将被再次调用, MyAdapter项目将被完全更改。

例如,如果我想显示types为“游戏”的项目,我有两个不同的列表:“拥有的游戏”和“愿望列表游戏”,我可以调用binding.setItems(whateverItems)来完全刷新显示的项目,但是例如如果我将“愿望清单游戏”移到列表中去按相关性进行组织,那么每个列表中只会执行一些微小的更改,而不会刷新整个事情。

原来这个想法是不可行的,因为每次对ObservableList进行一次更改时,数据绑定都会重新执行BindingAdapter ,所以例如我观察了下面的行为:

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

这种行为似乎对我来说是相当破碎的,因为阻止ObservableList在数据绑定的xml可用。 我不能认真弄清楚这种行为是合乎情理的。

我查了一些例子: 这里和这个其他的问题

在第一个链接中,所有的例子都直接使用了ObservableListAdapter ,甚至没有通过表单xml和实际的数据绑定,而在SO回答中链接的代码中,开发者做了基本上与我尝试做的事情相同的事情,增加:

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

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

这种行为的需要是什么? 可能有些情况下,这种行为是可取的? 我觉得ObservableList是一个添加了数据绑定的function,除非与实际的数据绑定一起使用,否则这会强制您抵御其行为。 如果我在xml数据标签和BindingAdapter签名中声明它为一个简单的List ,那么我可以将它转换回MyAdapter里面的MyAdapter ,它工作的很好,但是这是一个非常糟糕的破解。 如果它只是一个独立的数据绑定function,而不会在每次更改时触发绑定,那么在我看来会更好。

Solutions Collecting From Web of "Android数据绑定ObservableList行为问题"

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

 <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的逻辑。