Android ArrayAdapter.Add method not working

Mike picture Mike · Feb 26, 2011 · Viewed 21.7k times · Source

The ArrayAdapter.add() method is not working for me. I am using Eclipse Helios 3.6 with ADT Plugin, Target Source is a Froyo 2.2 emulator and 2.2 HTC Evo 4g. Here is my java class

    import android.app.Activity;
    import android.os.Bundle;
    import android.widget.ArrayAdapter;

    public class Main extends Activity {

         @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);

            String[] entries = {"List Item A", "List Item B"};

            ArrayAdapter<String> arrAdapt=new ArrayAdapter<String>(this, R.layout.list_item, entries);

             arrAdapt.setNotifyOnChange(true);
             arrAdapt.add("List Item C");
        }
    }

And here is my layout for the list item (list_item.xml)

<?xml version="1.0" encoding="utf-8"?>
<TextView
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="fill_parent"
  android:layout_height="fill_parent">
  android:padding="10dp"
  android:textSize="12sp"
</TextView>

It is giving me and error in the LogCat that says

Caused by: java.lang.UnsupportedOperationException at java.util.AbstractList.add(AbstractList.java:411) at java.util.AbstractList.add(AbstractList.java:432) at android.widget.ArrayAdapter.add(ArrayAdapter.java:178)

Answer

erichamion picture erichamion · Feb 26, 2011

I'm just learning, but if I'm reading the source correctly, ArrayAdapter's constructor doesn't copy references to each of the elements in the array or list. Instead, it directly uses the list that's passed in, or for an array uses asList() to treat the original array as a list. Since the list returned by asList() is still just a representation of the underlying array, you can't do anything (such as resize) that you couldn't do with an array.

Try passing a list like ArrayList instead of an array.

ArrayList<String> entries = 
        new ArrayList<String>(Arrays.asList("List Item A", "List Item B"));

ArrayAdapter<String> arrAdapt=
        new ArrayAdapter<String>(this, R.layout.list_item, entries);

arrAdapt.setNotifyOnChange(true);
arrAdapt.add("List Item C");