我想使用这个带有数据绑定的自定义微调器,用我的列表绑定条目:https://github.com/miteshpithadiya/SearchableSpinner
一切都适用于标准微调器,示例xml布局:
<android.support.v7.widget.AppCompatSpinner
android:id="@+id/add_event_internal_category_spinner"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginEnd="16dp"
android:layout_marginLeft="16dp"
android:layout_marginRight="16dp"
android:layout_marginStart="16dp"
android:layout_marginTop="@dimen/default_margin"
android:entries="@{event.internalCategoryNames}"
android:prompt="@string/spinner_category_title"
android:selectedItemPosition="@={event.selectedInternalCategoryPosition}"
android:visibility="@{event.editable?View.VISIBLE:View.GONE}"
app:layout_constraintHorizontal_bias="0.0"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toBottomOf="@+id/textView6"/>
但是,如果我尝试使用可搜索的微调控件而不是标准微调器,我会得到一个例外:
java.lang.ClassCastException:android.databinding.adapters.ObservableListAdapter无法强制转换为android.widget.ArrayAdapter
控件尝试设置适配器,代码时抛出异常:
@Override
public void setAdapter(SpinnerAdapter adapter)
{
if (!_isFromInit)
{
_arrayAdapter = (ArrayAdapter) adapter; //--EXCEPTION
if (!TextUtils.isEmpty(_strHintText) && !_isDirty)
{
ArrayAdapter arrayAdapter = new ArrayAdapter(_context, android.R.layout
.simple_list_item_1, new String[]{_strHintText});
super.setAdapter(arrayAdapter);
}
else
{
super.setAdapter(adapter);
}
}
else
{
_isFromInit = false;
super.setAdapter(adapter);
}
}
ObservableListAdapter
是私有包,因此无法使用。你知道什么是错的吗? SearchableSpinner
延伸Spinner
类:https://github.com/miteshpithadiya/SearchableSpinner/blob/master/searchablespinnerlibrary/src/main/java/com/toptoche/searchablespinnerlibrary/SearchableSpinner.java
你得到了那个例外,因为android:entries
的数据绑定系统标准绑定适配器使用并设置了ObservableListAdapter
。
在AbsSpinnerBindingAdapter
(无论是androidx还是android):
@BindingAdapter({"android:entries"})
public static <T> void setEntries(AbsSpinner view, List<T> entries) {
if (entries != null) {
SpinnerAdapter oldAdapter = view.getAdapter();
if (oldAdapter instanceof ObservableListAdapter) {
((ObservableListAdapter) oldAdapter).setList(entries);
} else {
view.setAdapter(new ObservableListAdapter<T>(view.getContext(), entries,
android.R.layout.simple_spinner_item,
android.R.layout.simple_spinner_dropdown_item, 0));
}
} else {
view.setAdapter(null);
}
}
所以可以使用AppCompatSpinner
(以及Spinner
),但你使用的SearchableSpinner
期望它是一个ArrayAdapter
。
解
您必须声明自己的绑定适配器,自定义setter,它使用ArrayAdapter
。您可以为android:entries
属性提供自己的属性(数据绑定系统将使用您的属性而不是标准属性),或者您创建一个新的属性名称并在XML中使用它(例如bind:entries
)。如果你不知道如何,看看here。