Адаптер Android Array с ArrayList и ListView не обновляется при изменении архаиста

У меня есть приложение для Android с экраном, состоящим из ListView, который я использую для отображения списка устройств. Эти устройства хранятся в массиве.

Я пытаюсь использовать ArrayAdapter для отображения того, что находится в массиве на экране в списке.

Он работает, когда я сначала загружаю класс SetupActivity, однако есть возможность добавить новое устройство в метод addDevice(), что означает, что массив удерживает устройства обновляются.

Я использую notifyDataSetChanged(), который должен обновить список, но он не работает.

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
}
}

Кто-нибудь может увидеть, где я ошибаюсь?

Ответ 1

Для ArrayAdapter notifyDataSetChanged работает только в том случае, если вы используете в адаптере функции add, insert, remove и clear.

  • Используйте clear для очистки адаптера - arrayAdapter.clear()
  • Используйте Adapter.add и добавьте вновь сформированный список - arrayAdapter.add(deviceList)
  • Вызов notifyDataSetChanged

Альтернатива:

  • Повторите этот шаг после создания нового девицеиста, но это избыточная

    arrayAdapter = new ArrayAdapter<Device>(this, android.R.layout.simple_list_item_1, deviceList);
    
  • Создайте свой собственный класс, полученный из BaseAdapter и ListAdapter, который дает вам большую гибкость. Это рекомендуется.

Ответ 2

Хотя принятый ответ решает проблему, объяснение причины неверно, и поскольку это важная концепция, я думал, что попытаюсь прояснить. Объяснение Slartibartfast о том, что notifyDataSetChanged() работает только при неправильном вызове add, insert, remove или clear. Это объяснение относится к методу setNotifyOnChange(), который, если он установлен в true (по умолчанию), будет автоматически вызывать notifyDataSetChanged() при возникновении любого из этих четырех действий. Я думаю, что плакат путал эти два метода. Сам notifyDataSetChanged() не имеет этих ограничений. Он просто сообщает адаптеру, что список, на который он смотрит, изменился, и не имеет значения, как произошло изменение списка. Хотя я не могу видеть исходный код для вашего createNewDeviceList(), я бы предположил, что ваша проблема возникла из-за того, что у вас был адаптер, ссылающийся на исходный список, который вы создали, а затем вы создали новый список в createNewDeviceList(), а поскольку адаптер все еще указывал на старый список, он не мог видеть изменения. Решение slartibartfast работает, потому что оно очищает адаптер и специально добавляет обновленный список к этому адаптеру. Таким образом, у вас нет проблемы с адаптером, указывающим на неправильное место. Надеюсь, это поможет кому-то!

Ответ 3

ваш метод addDevice вызывает бесконечный цикл. Не вызывайте метод из себя, как вы здесь:

deviceList = addDevice();