ListView в Android: Простое использование

http://www.vogella.de/articles/AndroidListView/article.html
  • Перевод
Блуждал в Интернете в поисках достойного мануала. Нашел, по моему мнению, достойный, но, как водится в кругах программирования под Android он, конечно же, на английском. Вот и решил привнести свой вклад в распространение мануалов в этой среде на русском. Буду его изучать и, попутно, переводить сюда.

Напомню, что статья является переводом этой статьи с разрешения ее автора.

Продолжение статьи находится здесь. В нем рассматривается кастомизация списков и советы по их оптимизации.

Мануал написан под Android 4, Eclipse 3.7, Java 1.6. Источник можно найти здесь.

Списки — это вещь обычная в современных мобильных устройствах. Мы можем перемещаться по списку и выбирать нужный нам элемент, чтобы открыть что-то. Так и у Андроида он имеется.

ListActivity


Вы можете напрямую использовать ListView в своем проекте, как и любой другой компонент интерфейса пользователя. Если основная цель вашей Деятельности это отображение списка, то вы можете расширить класс Activity классом ListActivity, что значительно упростит использование ListView.

ListActivity расширяет Activity, чтобы упростить использование списков. Например, у вас уже будет предопределенный метод, обрабатывающий нажатие на элемент списка.

ListActivity содержит ListAdapter, ответственный за управление содержимым. Адаптер должен быть установлен в методе onCreate() вашей деятельности через метод setListAdapter().

При нажатии на элемент списка вызывается метод onListItemClick(). Этот метод позволяет получить доступ к выбранному элементу.

В Андроиде уже есть некоторые предопределенные шаблоны для использования в Адаптере, например «android.R.layout.simple_list_item1». Если же вы не хотите использовать предопределенный шаблон, ваш шаблон должен иметь идентификатор "@android:id/list", который будет называться ListView. Например:

<ListView
  android:id="@+android:id/list"
  android:layout_width="match_parent"
  android:layout_height="wrap_content" >
</ListView>


Так же вы можете использовать вид с id "@android:id/empty". Этот вид отображается, когда список пуст.

Адаптер


Что такое Адаптер?

ListView берет содержимое для отображения через адаптер. Адаптер расширяется классом BaseAdapter и отвечает за модель данных для списка и за расположение этих данных в его элементах.

В Андроиде есть два стандартных адаптера: ArrayAdapter и CursorAdapter. ArrayAdapter управляет данными, основанными на массивах или списках, в то время, как SimpleCursorAdapter управляет содержимым из базы данных. Так же вы можете разработать свой Адаптер, расширяющий эти два класса или же класс BaseAdapter.

Самый важный метод Адаптера — getView(). Он вызывается для каждого элемента списка, чтобы определить как и какие данные должны в нем отображаться. getVew() так же содержит параметр convertView, который позволяет использовать заново уже существующий элемент списка, который уже не отображается, т.к. пользователь пролистнул его с видимой части дисплея. Если convertView не пустой, он может быть использован заново, чтобы не грузить шаблон, что приводит к значительному приросту производительности, т.к. подгрузка XML файла достаточно ресурсоемка.

ListViews и производительность

Отображение большого количества данных на мобильном устройстве должно быть реализовано максимально эффективно. Поэтому ListView создает виды (виджеты) по необходимости и подкрепляет их к иерархии видов. Стандартный Адаптер ListView удаляет виды, например, если элемент больше не отображается, он будет стерт и только его содержимое поменяется. Если вы используете свой адаптер, то вы должны так же предусмотреть это, чтобы избежать проблем с производительностью.

Пример: Простой ListActivity


Сейчас мы создадим максимально простой список. Мы используем стандартный класс Adapter — ArrayAdapter и вид, предопределенный Андроидом.

Создайте новый проект «de.vogella.android.listactivity» с Деятельностью «MyListActivity». Не изменяйте шаблон main.xml. Создайте следующую Деятельность:

package de.vogella.android.listactivity;

import android.app.ListActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.Toast;

public class MyListActivity extends ListActivity {
	public void onCreate(Bundle icicle) {
		super.onCreate(icicle);
		String[] values = new String[] { "Android", "iPhone", "WindowsMobile",
				"Blackberry", "WebOS", "Ubuntu", "Windows7", "Max OS X",
				"Linux", "OS/2" };
		ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
				android.R.layout.simple_list_item_1, values);
		setListAdapter(adapter);
	}

	@Override
	protected void onListItemClick(ListView l, View v, int position, long id) {
		String item = (String) getListAdapter().getItem(position);
		Toast.makeText(this, item + " выбран", Toast.LENGTH_LONG).show();
	}
}


Заметьте, что мы не используем setContentView(). ListActivity использует шаблон ListView по-умолчанию, если другой шаблон не задан явно.

По нажатию одного из элементов списка будет выводиться стандартный «Тост» с информацией какой из элементов был выбран.

Прошу прощения за репост. Изначально не отметил как перевод. Большое спасибо jeston за наводку, принял и научился на ошибках.
  • +16
  • 60,8k
  • 7
Поделиться публикацией
Похожие публикации
Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Реклама
Комментарии 7
  • 0
    Я споткнулся на фразе:
    Если основная цель вашей Деятельности это отображение списка
    Нее, перевод — это хорошо, но зачем-же переводить специфические термины у которых нету аналога в русском?! В андроиде нету такого термина «Деятельность», есть Activity. Чтоб понять о чем речь, читателю все равно придется мысленно перевести слово обратно на английский если он знает про что речь, а если не знает — так он просто не поймет, да и нагуглить ничего не сможет.
    • 0
      Кстати, extends в контексте оригинальной статьи скорее значит «наследует», чем «расширяет». ИМХО «ListActivity расширяет Activity» не передает сути в достаточной мере.
      • 0
        Долго думал переводить такие термины или нет, причислять их к именам собственным, или ввести перевод. Гуглил, не нашел универсального глоссария для перевода таких терминов.
        А здесь, думаю, правильней «Activity расширяется ListActivity».
        Спасибо за комментарий.
    • 0
      Russion translation of an Android tutorial of mine. They give attribution but its really well hidden in the footer. ;-) habrahabr.ru/blogs/android_development/133569/

      from vogella twitter
      • 0
        На одной статье выставил, на другой забыл поставить :)
      • 0
        Ну раз разговор о ListView, то пожалуй порекомендую также к ознакомлению документ android-world-of-listview-android.pdf
        Хотя в оригинальной статье есть та-же информация что и в документе.
        • 0
          Вот если бы тут ещё рассмотрели создание своего адаптера, который наследуется от BaseAdapter, в котором используется своя вьюха для элементов, то была бы отличная статья.

          Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.