ListView возвращает исключение при изменении адаптера - PullRequest
1 голос
/ 28 октября 2011

У меня есть 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 Ответ

0 голосов
/ 28 октября 2011

см. Следующий 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
}
} 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...