Listview возвращает исключение при изменении адаптера

#android #android-layout #android-widget

#Android #android-макет #android-виджет

Вопрос:

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

 CustomArrayAdapter a = GetInitialData();
LayoutInflater layoutInflater = 
   (LayoutInflater)context.getSystemService( Context.LAYOUT_INFLATR_SERVICE );
LinearLayout ll = 
   (LinearLayout)layoutInflater.inflate(R.layout.more_button_layout, null, false);
Button b = (Button)ll.findViewById(R.id.more_button);

b.setOnClickListener(new OnClickListener() {

public void onClick(View v) {
    a.loadNextPage();
  }
});

lv.addFooterView(ll);
lv.setAdapter(a);
 

Проблема в том, что всякий раз, когда я нажимаю кнопку, я получаю ConcurrentModificationException в итераторе, которым владеет адаптер. Я считаю, что это вызвано тем фактом, что loadNextPage() вызывается во время выполнения итерации по списку, но я не могу понять, как сделать так, чтобы этого не было.

Ответ №1:

Смотрите следующий URL http://www.javacodegeeks.com/2011/05/avoid-concurrentmodificationexception.html

или попробуйте использовать CopyOnWriteArrayList

Это исключение может быть вызвано методами, которые обнаружили одновременную модификацию объекта, когда такая модификация недопустима.

Например, обычно для одного потока недопустимо изменять коллекцию, в то время как другой поток — или тот же поток — выполняет итерацию по ней.

Обратите внимание, что это исключение не всегда указывает на то, что объект был одновременно изменен другим потоком. Если один поток выдает последовательность вызовов метода, которая нарушает контракт объекта, объект может выдать это исключение. Например, если поток изменяет коллекцию напрямую, когда он выполняет итерацию по коллекции с помощью итератора с отказоустойчивостью, итератор удалит это исключение.

Пример:

 for (Iterator it = myCollection.iterator(); it.hasNext()) {
Object myObject = it.next();
if (someConditionIsTrue) {
// myCollection.remove(myObject); // wrong can throw ConcurrentModificationException
it.remove(myObject); // right
}
} 
 

Комментарии:

1. Проблема, с которой я сталкиваюсь, заключается в том, что список постоянно повторяется, чтобы отобразить его — я знаю, что это происходит, я просто не знаю, как это обойти. Я не думаю, что необходимо использовать CopyOnWriteArrayList, чтобы сделать что-то настолько простое, как динамически расширяющийся ListView.