在开发Spinner 中使用ArrayAdapter 时ArrayAdapter.createFromResource(this,R.array.spinneritem,R.layout.spinneritem)过程中spinneritem这个的根目录一定是一个TextView ,否则会报如下错误ArrayAdapter requires the resource ID to be a TextView
而不能是其它的,因为在ArrayAdapter 的源码中,当点击spinner 后选择Item时会调用getView方法此方法会调用createViewFromResource方法,在createViewFromResource方法里面会将spinneritem转化成TextView
代码如下:
@Override public @NonNull View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) { return createViewFromResource(mInflater, position, convertView, parent, mResource); } private @NonNull View createViewFromResource(@NonNull LayoutInflater inflater, int position, @Nullable View convertView, @NonNull ViewGroup parent, int resource) { final View view; final TextView text; if (convertView == null) { view = inflater.inflate(resource, parent, false); } else { view = convertView; } try { if (mFieldId == 0) { // If no custom field is assigned, assume the whole resource is a TextView text = (TextView) view; } else { // Otherwise, find the TextView field within the layout text = view.findViewById(mFieldId); if (text == null) { throw new RuntimeException("Failed to find view with ID " + mContext.getResources().getResourceName(mFieldId) + " in item layout"); } } } catch (ClassCastException e) { Log.e("ArrayAdapter", "You must supply a resource ID for a TextView"); throw new IllegalStateException( "ArrayAdapter requires the resource ID to be a TextView", e); } final T item = getItem(position); if (item instanceof CharSequence) { text.setText((CharSequence) item); } else { text.setText(item.toString()); } return view; }