Android ListView с ArrayAdapter и фоновой службой не сохраняет элементы в правильном порядке

#android #listview

#Android #listview

Вопрос:

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

ArrayAdapter имеет элемент ArrayList, и все элементы находятся в правильном порядке, пока не будут показаны на экране. У меня также есть два ItemViewTypes, один для заголовка элементов и один для элементов, конечно. Это отображается с помощью «шаблона» ViewHolder.

Наверное, я упускаю что-то глупое.

Что может вызвать такое поведение?

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

1. лол, да, моя реализация могла быть проблемой, но, как я уже сказал … порядок элементов в порядке до тех пор, пока он не попадет в список. Позже будет создан образец приложения, чтобы продемонстрировать, что происходит. Не удается отобразить текущий код..

2. наиболее важными являются getItemViewType и getView. заголовки и элементы находятся в одном и том же ArrayList? … действительно сложно ответить без кода, и я не знаю, может быть, экран печати такого поведения

3. Некоторый код здесь: gist.github.com/1308835

4. вам не нужен тип элементов поддержки, если вы используете тот же макет, удалите getItemViewType и измените getView на pastebin.com/VGkr2f7U … в вашем коде вы не установили значения, если convertView != null 🙂

5. мой плохой .. я пропустил, что вы используете разные макеты … так что попробуйте это pastebin.com/zi29LLUh

Ответ №1:

Я предполагаю, что ArrayAdapter он содержит собственную неглубокую копию списка, который вы предоставляете при создании экземпляра ArrayAdapter . Если это предположение верно, следствием является то, что изменения элементов списка отображаются в ListView, в то время как изменения порядка элементов списка не будут отражены.

Если элементы вашего списка сопоставимы, так что требуемый порядок может быть восстановлен, вы можете вызвать ArrayAdapter.sort(Comparator comp) метод и метод ArrayAdapter.notifyDataSetChanged() впоследствии. В моем случае даже положение прокрутки было сохранено идеально.

Однако вы также можете попробовать использовать методы add и remove ArrayAdapter для обновления самого адаптера.