19

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)

1 Answer 1

41

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");
Sign up to request clarification or add additional context in comments.

2 Comments

If this is correct, the ArrayAdapter documentation could be clearer. There's no mention of the ability to add elements depending on the constructor used.
You are right, this solved my issues and my ListView within a LinearLayout now works!

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.