Android: изменение содержимого адаптера из фонового потока - PullRequest
3 голосов
/ 14 сентября 2010

Я немного прочитал об исключении, которое выдается при использовании BaseAdapter, но я не могу найти альтернативное решение: Убедитесь, что содержимое вашего адаптера не изменено из фонового потока

Чего я хочу добиться, так это сохранить копию очереди сообщений в памяти и использовать эту очередь сообщений для заполнения BaseAdapter для моего ListView.Причина, по которой я это делаю, заключается в том, что очередь сообщений будет продолжать получать сообщения из сокета, даже если ListView в данный момент отсутствует (например, окно чата).

Проблема возникает, когда у меня есть Activity с ListView на переднем плане, BaseAdapter , привязанный к данным очереди сообщений, и сообщение приходитв розетку.Добавление нового сообщения в очередь вызовет исключение, упомянутое выше.Если я предварительно не заполню свой BaseAdapter очередью сообщений (как в BaseAdapter, имеющей собственную очередь сообщений) и не обновлю их оба при поступлении нового сообщения, я не могу найти способ обойти этопроблема.

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

Ответы [ 2 ]

2 голосов
/ 01 ноября 2012

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

//Clear adapter's array
if (!array.isEmpty()) { array.clear(); }
if (adapter != null) { adapter = null; }
setListAdapter(adapter);

//Later code
//array gets repopulated
//adapter gets recreated
setListAdapter(adapter);
2 голосов
/ 14 сентября 2010

Используйте Handler для изменения "очереди сообщений" из основного потока приложения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...