我刚刚了解了 Android 上的 beta Databinding 库。我浏览了开发人员指南,但我仍然不确定如何将微调器绑定(bind)到自定义集合。问题是,这是否可能。
以下是使一切正常运行的步骤。
- 创建一个扩展 ObservableList.OnListChangedCallback 的类。
- 我们想要绑定(bind)到微调器(或其他基于适配器的 View )的自定义集合应该扩展 ObservableList(或其兄弟)并具有 addOnListChangedCallback(onListChangedCallback olcc)。
- 创建一个适用于我们的自定义集合的自定义适配器。 ObservableList.OnListChangedCallback 应该在我们想要监听的事件中通知适配器。
- 在开发人员指南中创建相应 View 的 xml 注释:数据部分中的 import + 变量和微调器的 app:adapter=。
- 使用@BindingAdapter() 注释为我们的自定义适配器创建自定义静态 setter 。
最佳答案
我是这是错误的,即使我实现了它!Spinner
没有属性 android:entries
所以这不是将值绑定(bind)到 Spinner 的方法。
entries 属性采用 CharSequence
数组。如果您希望它采用任意集合:
@BindingAdapter({"android:entries"})
public static void setEntries(AbsSpinner view, List<String> entries) {
if (entries != null) {
SpinnerAdapter oldAdapter = view.getAdapter();
boolean changed = true;
if (oldAdapter != null && oldAdapter.getCount() == entries.size()) {
changed = false;
for (int i = 0; i < entries.size(); i++) {
if (!entries.get(i).equals(oldAdapter.getItem(i))) {
changed = true;
break;
}
}
}
if (changed) {
ArrayAdapter<String> adapter =
new ArrayAdapter<String>(view.getContext(),
android.R.layout.simple_spinner_item,
entries.toArray(new String[entries.size()]);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
view.setAdapter(adapter);
}
} else {
view.setAdapter(null);
}
}
您可能应该使用 ObservableList
而不是 List
并添加一个监听器,以便在每次值更改时更新您的 ArrayAdapter。
因为它是一个 AdapterView
,所以您通常会使用 setAdapter()
方法。因此,您可以使用自动生成的属性app:adapter="@{myAdapter}"
来使用setAdapter()
方法。
如果你想使用像“条目”这样的自定义属性,你可以使用 BindingAdapter
创建一个。在您的应用程序的一个类中——哪个类并不重要,但按照惯例,它们按目标 View 类型分组:
public class SpinnerAdapter {
@BindingAdapter("entries")
public static void setEntries(Spinner view, final List<String> values) {
SpinnerAdapter spinnerAdapter = new SpinnerAdapter() {
// Use values to implement the SpinnerAdapter
}
view.setAdapter(spinnerAdapter);
}
}
如果您想使用自定义集合,请将 ListObservableList
)并通知适配器更改。
关于java - 自定义可观察集合android,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32310483/