[英]Custom spinner control, data binding runtime crashes while setting adapter
我想將此自定義微調器與數據綁定一起使用,以將條目與我的列表綁定: 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
。
解
您必須聲明自己的綁定適配器,即使用ArrayAdapter
自定義設置器。 您可以為android:entries
屬性提供自己的屬性(數據綁定系統將使用您的屬性而不是標准的),或者發明一個新的屬性名稱並在XML中使用它(例如bind:entries
)。 如果您不知道如何,請在這里看看。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.