#android #android-activity #adapter
#Android #android-активность #адаптер
Вопрос:
Я ищу рекомендации относительно того, как модулировать мой код. У меня есть activity и ListAdapter, и они становятся довольно сложными. Я не уверен, какой код должен находиться там, где и сколько знаний каждый из этих 2 классов должен иметь друг о друге. Как вы решаете, помещать ли код в действие или в его адаптер? И какие шаблоны вы используете, чтобы эти классы были как можно более скудными?
Ответ №1:
Ваше описание слишком общее, поэтому я не могу дать вам точный ответ (было бы полезно объяснить, почему они становятся все больше и больше, для чего нужен дополнительный код).
Но вообще говоря, просто подумайте о том, что должен делать каждый класс. «Активность» (как я ее вижу) — это главный контроллер, он «знает всех» и соединяет другие компоненты вместе (ListView с адаптером списка). Цель адаптера списка — просто сопоставить данные с представлениями. Если они становятся больше, извлеките новые (служебные) классы.
Например, предположим, что большая часть кода в ListAdapter форматирует временные метки (например, принимает временную метку как длинное значение и на основе текущего времени создает строку типа «2 часа назад»). Тогда имеет смысл создать новый служебный класс с именем timeFormat (с конструктором, который принимает контекст, он понадобится вам позже для извлечения строковых ресурсов). Затем ListAdapter создаст экземпляр этого класса.
Другим примером может быть сохранение данных. В этом случае вы могли бы создать класс с именем «Model» или «Document» (опять же с конструктором, использующим экземпляр «Context»). Он будет отвечать (например) за загрузку данных путем синтаксического анализа XML-файлов и сохранение данных путем создания XML-файлов. В этом случае этот класс будет создан с помощью действия.
Также обратите внимание, что ListAdapter действительно должен делать то, что он должен делать: создавать / настраивать представления на основе данных. Он никогда не должен зависеть от других представлений (в других представлениях он должен работать с любым ListView в любом файле макета). Итак, если у вас есть вызов «findViewById», который обращается к представлению за пределами ListView (или самого ListView), то этот код следует переместить в действие.
Кроме того, если вы сомневаетесь, вы можете попытаться найти приложение с открытым исходным кодом, которое является относительно зрелым и делает что-то подобное (и посмотреть, как это решает проблему).
Ответ №2:
Согласно документации adapter в Android
Объект адаптера действует как мост между AdapterView и базовыми данными для этого представления. Адаптер обеспечивает доступ к элементам данных. Адаптер также отвечает за создание представления для каждого элемента в наборе данных.
Итак, если ваш код связан с получением данных для отображения или созданием представлений, тогда он попадает в адаптер. Все остальное идет в действие или еще куда. Если вы тратите много кода на получение информации, которую хотите отобразить, рассмотрите возможность использования какого-либо класса AsyncTaskLoader. Обратите внимание, что к классам загрузчика можно получить доступ с уровней API ниже 3.0, используя пакет совместимости с Android.