Android Array Adapter with ArrayList and ListView not updating when the arraylist is changed

Pippa Rose Smith picture Pippa Rose Smith · Nov 7, 2012 · Viewed 56.4k times · Source

I have an android app with a screen that comprises of a ListView, which I am using to display a list of devices. These devices are held in an array.

I am trying to use the ArrayAdapter to display what is in the array on the screen in a list.

It works when I first load the SetupActivity class, however, there is the facility to add a new device in the addDevice() method, which means the array holding the devices is updated.

I am using notifyDataSetChanged() which is supposed to update the list but it doesn't seem to work.

public class SetupActivity extends Activity
{   
    private ArrayList<Device> deviceList;

    private ArrayAdapter<Device> arrayAdapter;

    private ListView listView;

    private DevicesAdapter devicesAdapter;

    private Context context;

    public void onCreate(Bundle savedInstanceState)  //Method run when the activity is created
    {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.setup);  //Set the layout

        context = getApplicationContext();  //Get the screen

        listView = (ListView)findViewById(R.id.listView);

        deviceList = new ArrayList<Device>();

        deviceList = populateDeviceList();  //Get all the devices into the list

        arrayAdapter = new ArrayAdapter<Device>(this, android.R.layout.simple_list_item_1, deviceList);

        listView.setAdapter(arrayAdapter);  
    }

    protected void addDevice()  //Add device Method (Simplified)
    {
        deviceList = createNewDeviceList();    //Add device to the list and returns an updated list

        arrayAdapter.notifyDataSetChanged();    //Update the list
}
}

Can anyone see where I am going wrong?

Answer

Vrashabh Irde picture Vrashabh Irde · Nov 7, 2012

For an ArrayAdapter, notifyDataSetChanged only works if you use the add, insert, remove, and clear functions on the Adapter.

  1. Use clear to clear the adapter - arrayAdapter.clear()
  2. Use Adapter.addAll and add the newly formed list - arrayAdapter.addAll(deviceList)
  3. Call notifyDataSetChanged

Alternatives:

  1. Repeat this step after new devicelist is formed - but this is redundant

    arrayAdapter = new ArrayAdapter<Device>(this, android.R.layout.simple_list_item_1, deviceList);
    
  2. Create your own class derived from BaseAdapter and ListAdapter that gives you more flexibility. This is most recommended.