我刚看过Android上的beta版数据绑定库。我浏览了开发人员指南,但仍然不确定如何将微调器绑定到自定义集合。问题是,是否有可能。
这是使所有事物正常工作的步骤。
即使我实施了它,我还是错了!Spinner
没有属性,android:entries
因此不是将值绑定到微调框的方法。
entrys属性采用的数组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()
方法。
如果要使用“ entries”之类的自定义属性,则可以使用来创建一个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);
}
}
如果要使用自定义集合,请将List <String>替换为您的自定义集合类型。如果您希望它可观察,则Adapter支持数据更改通知,因此请确保将侦听器添加到您提供的任何列表中(例如ObservableList
),并通知适配器更改。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句