簡體   English   中英

自定義微調器控件,設置適配器時數據綁定運行時崩潰

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM