Android数据绑定ObservableList行为问题

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

起初它看起来像一个很酷的工具来显示列表,通过数据绑定 ,通过xml将它们添加到RecyclerView 。 为此,我制作了一个像这样的BindingAdapter :

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

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

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

所以我想要实现的逻辑是:

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

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

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

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

这种行为对我来说似乎很破碎,因为防止ObservableList在数据绑定的xml可用。 我不能认真地弄清楚这种行为是可取的合法案例。

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

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

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

在他的Adapter.setItems(ObservableList items)的开头,放弃因ObservableList的简单更改而调用该方法的所有情况。

这种行为有什么需要? 可能在某些情况下需要这种行为? 我觉得ObservableList是一个添加了数据绑定的function,除非与实际数据绑定一起使用时非常有用,在这种情况下它会强制您防止其行为。 如果我在xml数据标签和BindingAdapter签名BindingAdapter它声明为一个简单的List ,那么我可以将它转换回MyAdapter ObservableList并且它工作正常,但这是一个非常糟糕的黑客。 如果它只是数据绑定的一个单独function,在每次更改时都没有触发绑定,那么在我看来它会好得多。

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

          

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