Какой адаптер использовать - BaseAdapter или ArrayAdapter?

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

  • Имя
  • Сообщение
  • Отметка
  • URL профиля фото

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

Ответ 1

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

Стратегия 1

Достаточно ArrayAdapter с помощью метода override 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.
  • Преимущество 2. Не требует, чтобы вы манипулировали toString() в соответствии с вашим намеченным отображением (в конце концов, разделение модели и логики просмотра никогда не является плохим дизайном).

Стратегия 2

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

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

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