Адаптер 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();