Android studio listview

ListView в Android позволяет создавать и отображать списки, состоящие из множества пунктов. Этот инструментарий позволяет создавать разнообразные меню, а также опции для выбора пользователем того или иного пункта. Рассмотрим, как можно создать простейший список.

Мы создадим микро-приложение, которое будет отображать список названий животных.

При нажатии на определенное название будет появляться всплывающее уведомление с этим же словом.

Итак, создадим файл layout-a (activity_main.xml):

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical">   <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/my_list"> </TextView> <ListView android:id="@+id/lview" android:layout_width="match_parent" android:layout_height="wrap_content"> </ListView> </LinearLayout>

Здесь мы в LinearLayout поместили элемент TextView, в котором будем просто выводить название нашего списка, и элемент ListView, который будем заполнять списком названий.

Все строковые ресурсы помещаем в файл strings.xml:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 <?xml version="1.0" encoding="utf-8"?> <resources> <string name="app_name">ListView</string> <string name="action_settings">Settings</string> <string name="my_list">Мой список</string>   <string-array name="animals_name"> <item>Lion</item> <item>Fish</item> <item>Cat</item> <item>Dog</item> <item>Snake</item> </string-array> </resources>

string-array будем использовать для пунктов списка. Добавим код в файл MainActivity.java:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 package ru.androiddocs.listview;   import android.os.Bundle; import android.app.Activity; import android.view.View; import android.widget.AdapterView; import android.widget.ArrayAdapter; import android.widget.ListView; import android.widget.AdapterView.OnItemClickListener; import android.widget.Toast;   public class MainActivity extends Activity {   String[] animals;   public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main);   ListView lView = (ListView) findViewById(R.id.lview); animals = getResources().getStringArray(R.array.animals_name);   // создаем arrаy-адаптер ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, animals);   // присваиваем адаптер списку lView.setAdapter(adapter);   lView.setOnItemClickListener(new OnItemClickListener() {   @Override public void onItemClick(AdapterView<?> arg0, View arg1, int pos, long id ) {   Toast toast = Toast.makeText( getApplicationContext(), animals[pos], Toast.LENGTH_SHORT ); toast.show(); } });   } }

Как видно из кода, все события разворачиваются в методе onCreate(). Мы находим наш ListView в layout:

1 ListView lView = (ListView) findViewById(R.id.lview);

Получаем доступ до массива с названиями животных:

1 animals = getResources().getStringArray(R.array.animals_name);

Cоздаем arrаy-адаптер, вызывая конструктор с тремя параметрами (контекст, макет layout для пункта списка и массив пунктов:

1 ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, animals);

В качестве layout-а мы использовали встроенный в систему макет simple_list_item_1, который имеет следующую структуру:

1 2 3 4 5 6 7 8 9 10 11 <?xml version="1.0" encoding="utf-8"?> <TextView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@android:id/text1" android:layout_width="match_parent" android:layout_height="wrap_content" android:textAppearance="?android:attr/textAppearanceListItemSmall" android:gravity="center_vertical" android:paddingStart="?android:attr/listPreferredItemPaddingStart" android:paddingEnd="?android:attr/listPreferredItemPaddingEnd" android:minHeight="?android:attr/listPreferredItemHeightSmall" />

Можно довольствоваться этим макетом, а можно создать свой и поместить его в res/layout (тогда в параметрах нужно изменить имя и ссылку на layout).

Далее присваиваем адаптер списку:

1 lView.setAdapter(adapter);

Кстати, здесь код можно было бы сделать покороче:

1 lView.setAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, animals));

Затем для обработки события клика по отдельному пункту списка мы добавляем слушателя с параметром экземпляра класса обработки клика:

1 lView.setOnItemClickListener(new OnItemClickListener() …

Внутри класса обработчика имеется метод onItemClick(), принимающий несколько параметров, среди которых есть и номер позиции нажатого пункта, начиная с 0.

Используя данное значение как ключ в массиве annimals, мы достаем название животного и выводим его с помощью Toast.

Получается как на скрине

Рубрика: Разное

.

Урок 42. Список — ListView

В этом уроке:

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

Перед тем, как начать говорить про компонент ListView, предлагаю вспомнить еще раз прошлый урок и механизм построения списка, который мы там использовали. Мы перебирали массив данных, в каждой итерации создавали пункт списка, заполняли его данными и помещали в список.

При создании ListView создавать пункты за нас будет адаптер. Адаптеру нужны от нас данные и layout-ресурс пункта списка. Далее мы присваиваем адаптер списку ListView. Список при построении запрашивает у адаптера пункты, адаптер их создает (используя данные и layout) и возвращает списку. В итоге мы видим готовый список.

Есть различные типы списков и адаптеров. Мы пока что рассмотрим простейший вариант.

Создадим проект:

Project name: P0421_SimpleList
Build Target: Android 2.3.3
Application name: SimpleList
Package name: ru.startandroid.develop.p0421simplelist
Create Activity: MainActivity

Открываем main.xml и добавим на экран компонент ListView (вкладка Composite):

<?xmlversion=»1.0″encoding=»utf-8″?>
<LinearLayout
xmlns:android=»http://schemas.android.com/apk/res/android»
android:layout_width=»fill_parent»
android:layout_height=»fill_parent»
android:orientation=»vertical»>
<TextView
android:layout_width=»fill_parent»
android:layout_height=»wrap_content»
android:text=»@string/hello»>
</TextView>
<ListView
android:id=»@+id/lvMain»
android:layout_width=»match_parent»
android:layout_height=»wrap_content»>
</ListView>
</LinearLayout>

ListView – это и есть компонент списка.

Теперь надо создать адаптер. Открываем MainActivity.java и пишем:

Вы не поверите, но это весь код, необходимый для создания списка )

В качестве данных используем массив имен. В onCreate мы находим список, создаем адаптер и присваиваем адаптер списку. Давайте разберемся, как создали адаптер.

Мы использовали этот конструктор: public ArrayAdapter (Context context, int textViewResourceId, T[] objects)

и передали ему следующие параметры:

this – контекст
android.R.layout.simple_list_item_1 – это системный layout-файл, который представляет собой TextView
names – массив данных, которые мы хотим вывести в список

Мы можем посмотреть содержимое использованного simple_list_item_1. Для этого в вашем проекте найдите пункт Android 2.3.3., раскройте его, и раскройте android.jar

Проматывайте в самый низ и открывайте res.layout.

И внутри находим используемый нами simple_list_item_1

Двойной клик на него и смотрим содержимое:

<?xmlversion=»1.0″encoding=»utf-8″?>
<TextView
xmlns:android=»http://schemas.android.com/apk/res/android»
android:id=»@android:id/text1″
android:layout_width=»match_parent»
android:layout_height=»wrap_content»
android:textAppearance=»?android:attr/textAppearanceLarge»
android:gravity=»center_vertical»
android:paddingLeft=»6dip»
android:minHeight=»?android:attr/listPreferredItemHeight»>
</TextView>

Обычный TextView с набором параметров.

Когда список при формировании запрашивает очередной пункт, адаптер берет этот Layout-ресурс simple_list_item_1, прогоняет его через LayoutInflater и получает View, преобразует View к TextView, присваивает ему текст из массива данных и отдает списку.

Все сохраним и запустим.

Видим список из наших данных.

Использование системного layout-ресурса simple_list_item_1 хорошо тем, что нам не надо самим layout рисовать. Однако, если нас не устраивает то, как выглядит список с использованием simple_list_item_1 в качестве пункта списка, мы можем создать свой layout-ресурс.

Создадим layout-файл my_list_item.xml в папке res/layout нашего проекта:

<?xmlversion=»1.0″encoding=»utf-8″?>
<TextView
xmlns:android=»http://schemas.android.com/apk/res/android»
android:id=»@+id/textView1″
android:layout_width=»match_parent»
android:layout_height=»wrap_content»
android:gravity=»center_horizontal»
android:padding=»5dp»
android:text=»TextView»
android:textColor=»#00FF00″
android:textSize=»24sp»>
</TextView>

TextView с указанием цвета и размера шрифта, выравнивания текста и отступов.

Изменим существующий код, укажем адаптеру наш созданный layout-ресурс my_list_item:

Теперь адаптер будет использовать его при создании пунктов списка.

Все сохраним и запустим. Видим наш зеленый список:

В layout-ресурсе для пункта списка вместо TextView вы можете использовать какой-нибудь его производный класс – например Button.

Главное, чтобы объект прошел преобразование к TextView. Адаптер присвоит ему текст методом setText и отдаст списку.

Немного про Context

На одном из прошлых уроков я говорил, что Context (контекст) используется для доступа к базовым функциям приложения. В этом уроке у нас получилось хорошее подтверждение этим словам.

ArrаyAdapter использует LayoutInflater, чтобы конвертнуть layout-ресурс в View. Но получение объекта LayoutInflater – это одна из базовых функций и она недоступна для класса ArrаyAdapter.

Поэтому мы в ArrаyAdapter в качестве контекста передаем ссылку на Activity (Activity имеет доступ к базовым функциям через восходящую иерархию классов). А класс ArrayAdapter внутри себя использует переданный ему контекст, чтобы вызвать LayoutInflater. Без контекста он не смог бы это сделать.

На следующем уроке:

— используем список ListView для одиночного и множественного выбора элементов

public ArrayAdapter (Context context, int textViewResourceId, T[] objects)

Добавить комментарий

Закрыть меню