Какой адаптер использовать - BaseAdapter или ArrayAdapter? - PullRequest
11 голосов
/ 19 ноября 2011

У меня есть строка JSON с несколькими экземплярами следующего

  1. Имя
  2. Сообщение
  3. Метка времени
  4. URL профиля фото

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

1 Ответ

10 голосов
/ 19 ноября 2011

Я предполагаю, что вы проанализировали строку JSON в объектной модели до рассмотрения любого случая ... давайте назовем этот класс Profile.

Стратегия 1

ArrayAdapter достаточно с переопределенным методом getView (..), который объединит несколько полей вместе, как вы хотите.

ArrayAdapter<Profile> profileAdapter = new ArrayAdapter<Profile>(context, resource, profiles) {
   @Override
   public View getView(int position, View convertView, ViewGroup parent) {
      View v;
      // use the ViewHolder pattern here to get a reference to v, then populate 
      // its individual fields however you wish... v may be a composite view in this case
   }
}

Я настоятельно рекомендую шаблон ViewHolder для потенциально больших списков: https://web.archive.org/web/20110819152518/http://www.screaming-penguin.com/node/7767

Это имеет огромное значение.

  • Преимущество 1. Позволяет применять сложный макет к каждому элементу в ListView.
  • Advantage 2. Не требует, чтобы вы манипулировали toString (), чтобы соответствовать вашему предполагаемому отображению (в конце концов, разделение логики модели и представления никогда не является плохой практикой проектирования).

Стратегия 2

В качестве альтернативы, если метод toString () в вашем репрезентативном классе уже имеет формат, приемлемый для отображения, вы можете использовать ArrayAdapter без overriding getView ().

Эта стратегия более проста, но заставляет вас разбивать все в одну строку для отображения.

ArrayAdapter<Profile> profileAdapter = new ArrayAdapter<Profile>(context, resource, profiles)
...