Странное поведение с ArrayAdapters в Android - PullRequest
2 голосов
/ 29 января 2012

Я играл с ArrayAdapters и достиг точки, когда я получаю разные результаты от двух почти идентичных комбинаций ArrayLists + ArrayAdapter.

Первая:

ArrayList объектов 'Restaurant', ArrayAdapter, который использует этот ArrayList, и ListView, который связывает этот ArrayAdapter.

private ArrayList<Restaurant> model = new ArrayList<Restaurant>();
private ArrayAdapter<Restaurant> restaurantAdapter = null; 
...
public void onCreate(Bundle savedInstanceState){
   ...
   restaurantAdapter = ArrayAdapter<Restaurant>(this, android.R.layout.simple_list_item_1, model);
   ...
   listView.setAdapter(restaurantAdapter);
   ...
}    

Второй:

ArrayList из объектов String, ArrayAdapter, которыйиспользует этот ArrayList и AutoCompleteTextView, который связывает этот ArrayAdatper.

private ArrayList<String> prevAddressList = new ArrayList<String>();
private ArrayAdapter<String> addListAdapter = null; 
...
public void onCreate(Bundle savedInstanceState){
   ...
   addListAdapter = ArrayAdapter<String>(this,android.R.layout.simple_list_item_1, prevAdddressList);
   ...
   autoCompleteField.setAdapter(addListAdapter);
   ...
}    

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

...onSave = new View.OnClickListener(){
...
restaurantAdapter.add(r); //r is a Restaurant object.
addListAdapter.add(autoCompleteField.getText().toString());
...
}

Теперь все работает правильно.Я получаю рестораны отображаются в ListView.Автозаполнение работает должным образом .... но я заметил кое-что, когда проверял значения во время отладки:

Фактические ArrayLists, модель (Restaurant) обновляются после добавления объекта в адаптер, но prevAddressList(Строка) нет.

Если я не установил AutoCompleteTextField пустым .... затем prevAddressList обновляется после добавления чего-либо во второй адаптер.

Уже пробовал использовать notifyDataSetChanged (), но это не имеет значения (и в любом случае он установлен на true для каждого адаптера по умолчанию.

Другое поведение, которое отличается между двумя адаптерами, заключается в том, что в первом (Restaurant) значения идут в поле mObjects, а во второмодин (String) вместо этого они собираются в mOriginalValues.

Я полностью растрепан.Единственное различие между этими двумя адаптерами состоит в том, что один тип «Ресторан», а другой тип «String».

Есть идеи?Может быть, я упускаю что-то очень очевидное?Дайте мне знать, если вам нужен полный код.

спасибо

Ответы [ 2 ]

0 голосов
/ 08 февраля 2012

Для тех, кто приходит сюда из Google:

Невозможно изменить ArrayAdapter в ListView: UnsupportedOperationException

Это может объяснить поведение, хотя я должен сам проверить его.

0 голосов
/ 02 февраля 2012

Вместо того, чтобы добавить его в адаптер, попробуйте добавить объект в список и затем вызвать notifyDataSetChanged для вашего адаптера.Адаптер должен принять ваши изменения, и в вашем списке, конечно, будет объект, который вы только что добавили.

...