我发现很难发现android.databinding.ObservableList
作为数据绑定功能的真正存在理由。
起初它看起来像是一个很酷的工具来显示列表,通过数据绑定,将它们添加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:items
来更新它的项目。RecyclerView
MyAdapter
现在最好的功能ObservableList
是您可以向其中添加一个OnListChangedCallback
,它可以处理与RecyclerView
添加/移动/删除/更改其中的项目相同的事件,而无需实际重新加载整个列表。
所以我想实现的逻辑是:
- 我从一个空的开始
MyAdapter
- 当从我的 API 中获取我的项目时,我会实例化一个
ObservableArrayList
包装它们并将其传递给binding
- 数据绑定调用我
BindingAdapter
将项目传递给MyAdapter
- 当
MyAdapter
收到新项目时,它会清除旧项目并在收到的项目中添加一个OnListChangedCallback
以ObservableList
处理微更改 - 如果 , 中有任何变化
ObservableList
,MyAdapter
将相应地改变而不完全刷新 - 如果我想显示一组完全不同的相同项目类型,我可以重新设置
binding
变量,因此BindingAdapter
将再次调用并且MyAdapter
项目将完全改变。
例如,如果我想显示Game
我有两个不同列表的类型的项目:“拥有的游戏”和“愿望清单游戏”,我可以调用binding.setItems(whateverItems)
以完全刷新显示的项目,但是例如,如果我移动“愿望清单”游戏”围绕列表进行按相关性进行组织,每个列表中只会执行微小的更改,而不会刷新整个列表。
BindingAdapter
事实证明这个想法是不可行的,因为每次对 a 进行一次更改时,数据绑定都会重新执行ObservableList
,因此例如我观察到休闲行为:
- 我从一个空的开始
MyAdapter
- 当从我的 API 中获取我的项目时,我会实例化一个
ObservableArrayList
包装它们并将其传递给binding
- 数据绑定调用我
BindingAdapter
将项目传递给MyAdapter
- 当
MyAdapter
收到新项目时,它会清除旧项目并在收到的项目中添加一个OnListChangedCallback
以ObservableList
处理微更改 - 如果 中发生任何变化
ObservableList
,BindingAdapter
则再次调用 ,从而再次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
并且它工作得很好,但这是一个非常糟糕的黑客攻击。如果它只是数据绑定的一个单独功能,而不是在每次更改时触发绑定,我认为它会好得多。