我需要在微调器中的特定位置显示该值,但得到一个
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
而不是TextView的spinnerList的ArrayList上起作用。那么,我需要做些什么才能直接调用getView()
来显示setSelection()
处的值,就像Android默认情况下发生的那样?
我已经阅读了以下内容(还有更多内容,但是没有发现任何有用的内容,因为在我的xml中没有ArrayAdapter.getView()
小部件的情况下,对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
<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" />
以及适配器将您的spinnerList值写入其自己的xml文件中的TextView元素:
<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/typeName"
style="@style/TypeName"/>
TextView将由您的自定义适配器使用,对于旋转器本身,将使用其getView()方法填充,对于单击后的扩展列表,将使用getDropDownView()方法填充:
@Override
public View getView(int position, View convertView, ViewGroup parent) {
Log.d(TAG, "Entered: getView");
convertView = mLayoutInflater.inflate(R.layout.type_name_only, null);
TextView typeName = convertView.findViewById(R.id.typeName);
typeName.setText(types.get(position));
return convertView;
}
@Override
public View getDropDownView(int position, View convertView, ViewGroup parent) {
Log.d(TAG, "Entered: getDropDownView");
convertView = mLayoutInflater.inflate(R.layout.type_name_only, null);
TextView typeName = convertView.findViewById(R.id.typeName);
typeName.setText(types.get(position));
typeName.setBackgroundColor(GREEN);
typeName.setTextColor(BLUE);
return convertView;
}
请注意,您还必须重写getCont()方法,以便适配器可以确定要添加到微调器中的元素数:
@Override
public int getCount() {
return yourList.size();
}
如果对您来说不是显而易见的,起初对我来说不是,您不会在Activity中声明或设置TextView,仅在微调器中声明:
mSpinner = findViewById(R.id.spinner);
在“活动”中,将微调器设置为其列表中的特定元素,如下所示:
mSelectTypeAdapter = new SelectTypeAdapter(mContext, R.id.spinner, spinnerList);
mSpinner.setAdapter(mSelectTypeAdapter);
mSpinner.setOnItemSelectedListener(this);
mSpinner.setSelection(spinnerList.indexOf(itemToBeSelected), true);
ViewGroup viewGroup = findViewById(android.R.id.content);
mSelectTypeAdapter.getView(spinnerList.indexOf(itemToBeSelected), mSpinner, viewGroup);
mSpinner.setSelection()选择要显示的特定列表索引,在这种情况下itemToBeSelected spinnerList的项目