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.

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

ListView - создаем простейший список с обработкой выбора пункта

Комментариев: 3 на “ListView — создаем простейший список с обработкой выбора пункта

  1. Алексей

    Доброго дня. НЕ могли бы вы мне помочь советом как сделать переход на активити. Как и многим, не имеющего спец образования, но обладающие энтузиазмом, зачастую используют такие , как ваш и многие другие, примеры как конструктор своего первого тестируемого приложения, и не осознавая что и к чему написано в коде.
    Уже больше месяца изучаю разные примеры что-то выписываю, сохраняю… Протестировал ваш пример-урок. Всё прекрасно заработало с первого раза, также и некоторые другие успешно заработали. Ближе к делу- не могли бы вы помочь мне дополнить код так, чтобы был переход на активити.??
    В интернете есть похожие примеры, но большинство из них лишь с частью кода или просто комментарии как сделать. К сожалению у меня пока не хватает знаний как именно дописать код чтобы он заработали и более того куда его правильно поместить чтобы он заработал.
    Буду ждать ответа… с Ув. Алексей

    Reply
  2. Алексей

    Спасибо за наводку. Соединил 2 кода, точнее прибавил в код из этой статьи вот такое

    // переход со списка
    Intent intent = new Intent(MainActivity.this, ActivityTwo.class);
    intent.putExtra(«current_animal», animals[1]);
    startActivity(intent);

    зарание создав и прописав в маницесте второе активити и убрал из МайнАктивити Toast

    Toast toast = Toast.makeText(
    getApplicationContext(), animals[pos], Toast.LENGTH_SHORT
    );
    toast.show();

    И финал кода получился таким

    @Override
    public void onItemClick(AdapterView arg0, View arg1,
    int pos, long id
    ) {

    // переход со списка
    Intent intent = new Intent(MainActivity.this, ActivityTwo.class);
    intent.putExtra(«current_animal», animals[1]);
    startActivity(intent);

    Переход на вторую активити работает- но работает со всех пунктов списка, как правильно доделать ?? и/или может что-то нужно дописать во вторую активити??

    Reply

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

Ваш e-mail не будет опубликован. Обязательные поля помечены *

*