自定义可观察集合android

时间:2015-08-31 11:45:32

标签: java android data-binding collections

我刚刚访问了Android上的beta Databinding 库。我浏览了开发人员的指南,然而,我仍然不确定,如何绑定,例如,微调器到自定义集合。问题是,如果可能的话。

以下是使所有事情都有效的步骤。

  • 创建一个扩展ObservableList.OnListChangedCallback。
  • 的类
  • 我们想要绑定到微调器(或其他基于适配器的视图)的自定义集合应该扩展ObservableList(或其兄弟)并使用addOnListChangedCallback(onListChangedCallback olcc)。
  • 创建适用于我们自定义集合的自定义适配器。 ObservableList.OnListChangedCallback应该在事件中通知适配器,我们想听。
  • 创建,用开发人员指南编写,对xml相应视图的注释:数据部分的import + variable和app:adapter = by spinner。
  • 使用@BindingAdapter()注释为我们的自定义适配器创建自定义静态setter。

1 个答案:

答案 0 :(得分:2)

Spinner没有属性android:entries,因此不知道如何将值绑定到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()方法。

如果您想使用&#34;条目&#34;等自定义属性,可以使用BindingAdapter创建一个。在应用程序的类中 - 与哪个类无关,但按照惯例,这些类按目标视图类型分组:

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&lt; String&gt;无论您的自定义集合类型是什么。如果您希望它是可观察的,则Adapter支持数据更改通知,因此请确保将侦听器添加到您提供的任何列表(例如ObservableList)并通知适配器更改。