android: spinner crashes app when clicked: "ArrayAdapter requires the resource ID to be a text view"

StackOverflow https://stackoverflow.com/questions/22994608

Question

I am trying to build an app with just a spinner for the beggining.

The app is launched and everything is ok until I press the spinner and then it crashes

with this message:

"ArrayAdapter requires the resource ID to be a text view"

Here is my code:

public class MainActivity extends ActionBarActivity {

private Spinner s;
String substance;
CharSequence substances[] = {"PenicillinV", "Amoxicillin", "Ampicillin"};

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    if (savedInstanceState == null) {
        getSupportFragmentManager().beginTransaction()
                .add(R.id.container, new PlaceholderFragment())
                .commit();
    }

    s = (Spinner) findViewById( R.id.substancesSpinner );

    ArrayAdapter<CharSequence> adapter = null;
    adapter = new ArrayAdapter<CharSequence>(this, android.R.layout.simple_spinner_item, substances );
    adapter.setDropDownViewResource( android.R.layout.simple_list_item_2 );
    s.setAdapter( adapter );

    s.setOnItemSelectedListener(new OnItemSelectedListener() {
        @Override
        public void onItemSelected(AdapterView<?> arg0, View view, int pos, long id){
            int index = s.getSelectedItemPosition();

            //storing string resources in an array
            substance = s.getSelectedItem().toString();
            Log.i("MyActivity", "substance " + substance);
            Toast.makeText(getBaseContext(), "You have selected : " +substances[index], Toast.LENGTH_SHORT).show();
        }

        public void onNothingSelected(AdapterView<?> arg0){
            //DoNothing
        }
    });



}

and here is the log:

04-10 17:04:17.922: E/ArrayAdapter(475): You must supply a resource ID for a TextView
04-10 17:04:17.922: D/AndroidRuntime(475): Shutting down VM
04-10 17:04:17.922: W/dalvikvm(475): threadid=1: thread exiting with uncaught exception (group=0x4001d800)
04-10 17:04:17.972: E/AndroidRuntime(475): FATAL EXCEPTION: main
04-10 17:04:17.972: E/AndroidRuntime(475): java.lang.IllegalStateException: ArrayAdapter requires the resource ID to be a TextView
04-10 17:04:17.972: E/AndroidRuntime(475):  at android.widget.ArrayAdapter.createViewFromResource(ArrayAdapter.java:347)
04-10 17:04:17.972: E/AndroidRuntime(475):  at android.widget.ArrayAdapter.getDropDownView(ArrayAdapter.java:376)
04-10 17:04:17.972: E/AndroidRuntime(475):  at android.widget.Spinner$DropDownAdapter.getDropDownView(Spinner.java:329)
04-10 17:04:17.972: E/AndroidRuntime(475):  at android.widget.Spinner$DropDownAdapter.getView(Spinner.java:325)
04-10 17:04:17.972: E/AndroidRuntime(475):  at android.widget.AbsListView.obtainView(AbsListView.java:1315)
04-10 17:04:17.972: E/AndroidRuntime(475):  at android.widget.ListView.measureHeightOfChildren(ListView.java:1198)
04-10 17:04:17.972: E/AndroidRuntime(475):  at android.widget.ListView.onMeasure(ListView.java:1109)
04-10 17:04:17.972: E/AndroidRuntime(475):  at android.view.View.measure(View.java:8171)
04-10 17:04:17.972: E/AndroidRuntime(475):  at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3132)
04-10 17:04:17.972: E/AndroidRuntime(475):  at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1012)
04-10 17:04:17.972: E/AndroidRuntime(475):  at android.widget.LinearLayout.measureVertical(LinearLayout.java:381)
04-10 17:04:17.972: E/AndroidRuntime(475):  at android.widget.LinearLayout.onMeasure(LinearLayout.java:304)
04-10 17:04:17.972: E/AndroidRuntime(475):  at android.view.View.measure(View.java:8171)
04-10 17:04:17.972: E/AndroidRuntime(475):  at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3132)
04-10 17:04:17.972: E/AndroidRuntime(475):  at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1012)
04-10 17:04:17.972: E/AndroidRuntime(475):  at android.widget.LinearLayout.measureVertical(LinearLayout.java:381)
04-10 17:04:17.972: E/AndroidRuntime(475):  at android.widget.LinearLayout.onMeasure(LinearLayout.java:304)
04-10 17:04:17.972: E/AndroidRuntime(475):  at com.android.internal.widget.WeightedLinearLayout.onMeasure(WeightedLinearLayout.java:60)
04-10 17:04:17.972: E/AndroidRuntime(475):  at android.view.View.measure(View.java:8171)
04-10 17:04:17.972: E/AndroidRuntime(475):  at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3132)
04-10 17:04:17.972: E/AndroidRuntime(475):  at android.widget.FrameLayout.onMeasure(FrameLayout.java:245)
04-10 17:04:17.972: E/AndroidRuntime(475):  at android.view.View.measure(View.java:8171)
04-10 17:04:17.972: E/AndroidRuntime(475):  at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3132)
04-10 17:04:17.972: E/AndroidRuntime(475):  at android.widget.FrameLayout.onMeasure(FrameLayout.java:245)
04-10 17:04:17.972: E/AndroidRuntime(475):  at android.view.View.measure(View.java:8171)
04-10 17:04:17.972: E/AndroidRuntime(475):  at android.view.ViewRoot.performTraversals(ViewRoot.java:801)
04-10 17:04:17.972: E/AndroidRuntime(475):  at android.view.ViewRoot.handleMessage(ViewRoot.java:1727)
04-10 17:04:17.972: E/AndroidRuntime(475):  at android.os.Handler.dispatchMessage(Handler.java:99)
04-10 17:04:17.972: E/AndroidRuntime(475):  at android.os.Looper.loop(Looper.java:123)
04-10 17:04:17.972: E/AndroidRuntime(475):  at android.app.ActivityThread.main(ActivityThread.java:4627)
04-10 17:04:17.972: E/AndroidRuntime(475):  at java.lang.reflect.Method.invokeNative(Native Method)
04-10 17:04:17.972: E/AndroidRuntime(475):  at java.lang.reflect.Method.invoke(Method.java:521)
04-10 17:04:17.972: E/AndroidRuntime(475):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
04-10 17:04:17.972: E/AndroidRuntime(475):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
04-10 17:04:17.972: E/AndroidRuntime(475):  at dalvik.system.NativeStart.main(Native Method)
04-10 17:04:17.972: E/AndroidRuntime(475): Caused by: java.lang.ClassCastException: android.widget.TwoLineListItem
04-10 17:04:17.972: E/AndroidRuntime(475):  at android.widget.ArrayAdapter.createViewFromResource(ArrayAdapter.java:340)
04-10 17:04:17.972: E/AndroidRuntime(475):  ... 34 more
04-10 17:04:18.082: D/dalvikvm(475): GC_FOR_MALLOC freed 2976 objects / 266592 bytes in 97ms
04-10 17:04:20.142: I/Process(475): Sending signal. PID: 475 SIG: 9
Was it helpful?

Solution

android.R.layout.simple_dropdown_item_1line instead of android.R.layout.simple_list_item_2 will fix the first issue as you had mentioned.

For the second issue, I have had issues in the past getting the dropdowns to theme correctly. Especially when using dark with light action bar. Sometimes you have to use the themed context instead. If its in the actionbar, try using

 new ArrayAdapter<CharSequence>(getActionBar().getThemedContext() 
 ,android.R.layout.simple_spinner_item, substances );

Otherwise I would suggest you create your own layout for the dropdown item and replace android.R.layout.simple_dropdown_item_1line with the one your created.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top