【发布时间】:2020-04-03 22:33:59
【问题描述】:
我需要在微调器的特定位置显示值,但得到一个
java.lang.IllegalStateException: ArrayAdapter 需要资源 ID 成为一个TextView
错误,因为我的微调器使用了如下设置的简单列表:
mSpinner = findViewById(R.id.spinner);
TextView msgTv = findViewById(R.id.errorMessage);
if (listTypes.size() > 0) {
/*
hide the error message
*/
msgTv.setVisibility(View.GONE);
/*
* the List has more than zero elements, so print them out in LogCat
*/
for(int i = 0; i < listTypes.size(); i++) {
Type type = listTypes.get(i);
int id = type.getId();
typeNameString = type.getType();
Log.d(TAG, "type " + typeNameString + " with an ID of: " + id);
}
//create spinner List<> of Type names only for use with the spinner
spinnerList = new ArrayList<>();
for (int i = 0; i < listTypes.size(); i++) {
typeNameString = listTypes.get(i).getType();
spinnerList.add(typeNameString);
Log.d(TAG, "Type " + i + " typeNameString is: " + typeNameString);
}
/*
* set the adapter to use 'this' context, the default Android spinner widget, typeCursor
* tyepCursor column as the source (from), display in the 'to' destination, no flags
*/
typeArrayAdapter = new ArrayAdapter<>(this, R.layout.support_simple_spinner_dropdown_item, spinnerList);
mSpinner.setAdapter(typeArrayAdapter);
} else{
/*
* no types exist in TABLE_TYPE, so add them
*/
msgTv.setText(R.string.no_types);
msgTv.setVisibility(View.VISIBLE);
}
我生成微调器的代码如下:
private void setProviderInfo(){
Log.d(TAG, "Entered setProviderInfo");
.
.
.
mSpinner.setAdapter(typeArrayAdapter);
mSpinner.setSelection(spinnerList.indexOf(type), true);
//TODO: try getView() to display the setSelection() value in spinner
ViewGroup view = (ViewGroup) findViewById(android.R.id.content);
typeArrayAdapter.getView(position, mSpinner, view);
.
.
.
}
我的微调器的 xml 是:
<Spinner
android:id="@+id/spinner"
style="@style/Spinner"
android:prompt="@string/select_provider_type"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/tvProviderTitle" />
风格是:
<style name="Spinner">
<item name="android:layout_width">match_parent</item>
<item name="android:layout_height">50dp</item>
<item name="android:layout_marginTop">8dp</item>
<item name="android:background">@android:color/holo_blue_bright</item>
<item name="android:layout_marginStart">8dp</item>
<item name="android:paddingTop">5dp</item>
<item name="android:paddingBottom">10dp</item>
<item name="android:layout_marginEnd">8dp</item>
<item name="android:clickable">true</item>
我的微调器工作,这意味着 ArrayAdapter.getView() 工作在使用 R.layout.support_simple_spinner_dropdown_item 的微调器列表的 ArrayList 上,而不是 TextView。那么,我需要做什么才能直接调用getView() 以在setSelection() 显示值,就像Android 默认情况下那样?
我已阅读以下内容(还有更多内容),但没有发现任何有用的内容,因为对 ArrayAdapter.getView() 的初始默认调用在我的 xml 中没有 TextView 小部件的情况下有效:
ArrayAdapter requires the resource ID to be a TextView
“ArrayAdapter requires the resource ID to be a TextView” issue
ArrayAdapter requires the resource ID to be a TextView in DialogFragment
“ArrayAdapter requires the resource ID to be a TextView” xml problems
“ArrayAdapter requires the resource ID to be a TextView” error for AndroidX
Android ExpandableListAdapter: ArrayAdapter requires the resource ID to be a TextView
【问题讨论】:
-
从一些调查看来,是的,ArrayAdapter.getView() 旨在用于实际显示显示由 setSelection() 指定的值的微调器。这在Android Adapter Tutorial: What Are Adapters in Android 进行了讨论。当我弄清楚这一点时,我会发布答案。
-
如果我理解正确,您需要创建自己的自定义适配器。在那里,您将覆盖 getView 方法并做任何您想做的事情,并膨胀您需要的任何布局
-
@sebasira,我得出了这个结论,因为在执行调试并进入 ArrayAdapter.java 时,我在 cmets 中发现了这一点:“默认情况下,数组适配器通过调用{@link Object#toString()} 在您提供的集合中的每个数据对象上,并将结果放在 TextView 中。“所以,我需要引用默认的 TextView,我不认为这是我可以,但我会调查并发布我的最终答案。
标签: java android android-arrayadapter android-spinner