Несколько ArrayAdapter, один массив - PullRequest
0 голосов
/ 02 марта 2012

У меня есть ArrayList, содержащий данные для отображения.Содержание изменяется асинхронно.Я хочу отобразить данные в двух действиях, оба используют ArrayAdapter (не тот же класс).

Проблема заключается в том, что ArrayAdapter обеспечивает синхронизированный доступ и уведомления посредством добавления, вставки и удаления.Таким образом, синхронизированный доступ возможен только через один, а не через два адаптера.

Сам ArrayAdapter не подлежит повторному использованию, так как используются разные представления.

Поэтому возникает вопрос: какова рекомендуемая архитектура для одногоArrayList с несколькими ArrayAdapter's?

Обновление
Я хотел бы уточнить.На данный момент у меня есть только один ArrayAdapter.

  • данные хранятся в ArrayList
  • служба обновляет данные в фоновом режиме через ArrayAdapter
  • обаАктивность и служба обращаются к ArrayList через ArrayAdapter (проблемы с многопоточностью синхронизации), но это не проблема, потому что ArrayAdapter выполняет блокировку

Теперь у меня есть другая активность, которая также должна отображать тот же ArrayList, и я нене знаю что делатьЯсно, что мне нужен еще один ArrayAdapter, потому что второе действие имеет другой макет.Это означает, что два действия и служба обращаются к одному и тому же ArrayList.Синхронизация ArrayAdapter больше не является достаточной, потому что блокировка находится в ArrayAdapter, что означает, что если служба и действие 1 используют ArrayAdapter 1, ArrayAdapter 2 по-прежнему будет обращаться к ArrayList и изменять его.

Ответы [ 3 ]

3 голосов
/ 02 марта 2012

Содержимое изменяется асинхронно.

Я не уверен, что понимаю, как вы используете ArrayList между двумя действиями.(статическое поле?)

Проблема в том, что ArrayAdapter становится владельцем массива (он дублирует его).

Не думаю, что он дублирует его.Он хранит ссылку на него.(исправьте меня, если я ошибаюсь)

Когда Activity2 активирована и создает ArrayAdapter2, ArrayList все еще принадлежит ArrayAdapter1.

Оба ArrayAdapters должны иметь ссылку на один и тот жеArrayList на данный момент.Это означает, что изменение в ArrayList будет отражено в обоих адаптерах.

0 голосов
/ 03 марта 2012

Это не проблема. После изменений в arrayList через один адаптер вызовите notifyDataSetChanged () для другого. Это все, что вам нужно, ИМХО. По крайней мере, этого достаточно для моего ArrayList, который также находится в другом Activity с его адаптером. И я изменяю его «вручную» и позже сообщаю об этом адаптеру.

Серьезная проблема будет, если вы захотите иметь один ListView с двумя адаптерами. Но я думаю, что это задача сенсеев.

Обновление ответа до обновленного вопроса:

Таким образом, проблема не в двух действиях, которые используют один и тот же массив данных разными ArrayAdapters, а в трех компонентах, использующих, возможно, два разных адаптера массива. Но если вы используете второй адаптер только для отображения того же списка, как вы пишете здесь, вам вообще не нужна дополнительная синхронизация. Просто вызовите adapter2.notifyDataSetChanged () после каждого значительного изменения.

Проблема может возникнуть, только если вы делаете одновременные изменения через два разных адаптера. Каждый не будет вовремя уведомлен об изменениях, сделанных другим. Что касается синхронизации между Действиями в случае вероятного одновременного письма, вы можете достигнуть этого, уведомляя после каждого изменения фокуса от одного Действия к другому.

Но написание синхронизации между service + adapter1 и Activity + adapter2 может быть достигнуто только в том случае, если вы обнаружите в своем коде несколько важных моментов, в которых должны быть сделаны взаимные уведомления и блокировки / разблокировки.

0 голосов
/ 02 марта 2012

Используйте один адаптер глобального массива для двух действий и наблюдайте за асинхронными данными.

...