Создание кастомного адаптера для ListView

By | 05.03.2014

Элемент ListView позволяет размещать в приложении прокручиваемые списки, причём как их оформить дело исключительно Ваших навыков и потребностей. Для того, чтобы сделать свой список с использованием кастомного адаптера, нужно сделать следующее:

  1. Создать модель данных (кастомный объект);
  2. Написать адаптер, который будет загружать данные в элемент ListView
  3. Сделать XML-файл для одной из записей, отображаемых в ListView, как шаблон оформления.

А теперь реализуем все вышеописанных шаги в нашем приложении. Создаём модель.

public class Item {
  String name;
 
  public void setName(String _name) {
    name = _name;
  }
 
  public String getName() {
    return name;
  }
}

Добавим в Activity сам список ListView

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  xmlns:tools="http://schemas.android.com/tools"
  android:layout_width="match_parent"
  android:layout_height="match_parent" >
 
  <ListView
    android:id="@+id/listItems"
    android:layout_width="match_parent"
    android:layout_height="wrap_content" >
  </ListView>
</RelativeLayout>

И сделаем экземпляр шаблона item.xml в папке ./res/layout

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="match_parent"
  android:layout_height="wrap_content"
  android:orientation="vertical"
  android:padding="0dp" >
 
  <TextView
    android:id="@+id/list_name"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" />
</LinearLayout>

Следующий шаг — создать список элементов для отображения:

ArrayList itemsList = new ArrayList();
 
Item item1 = new Item();
item1.setName("Name 1");
itemsList.add(item1);
 
Item item2 = new Item();
item2.setName("Name 2");
itemsList.add(item2);
 
Item item3 = new Item();
item3.setName("Name 3");
itemsList.add(item3);

Пишем кастомный адаптер для ListView на основе ArrayAdapter.

public class ListAdapter extends ArrayAdapter {
  private List data;
  private Context context;
 
  public ListAdapter(Context context, List data) {
    super(context, R.layout.item);
    this.data = data;
    this.context = context;
  }
 
  @Override
  public int getCount() {
    // возвращаем количество элементов списка
    return data.size();
  }
 
  @Override
  public String getItem(int position) {
    // получение одного элемента по индексу
    return data.get(position).getName();
  }
 
  @Override
  public long getItemId(int position) {
    return position;
  }
 
  @Override
  public View getView(int position, View convertView, ViewGroup parent) {
    // Объект для каждой из записей
    Item item = data.get(position);
 
    LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
 
    // создаём View и указываем наполнить её из R.layout.item, т.е. из нашего item.xml
    View view = inflater.inflate(R.layout.item, parent, false);
 
    // Находим наш TextView и пишем в него название из объекта
    ((TextView) view.findViewById(R.id.list_name)).setText(item.getName());
 
    return view;
  }
}

Ну и последнее — используем наш адаптер для наполнения списка.

// Ищем ListView
ListView listItems = (ListView) findViewById(R.id.listItems);
// Создаём адаптер и наполняем его данными
ListAdapter listAdapter = new ListAdapter(ctx, itemsList);
// Применяем адаптер к вьюхе
listItems.setAdapter(listAdapter);