Как работать с ListView в Android?

В этом небольшом примере хочу вам показать как работать с ListView и вешать на него обработчики.

Шаг 1

Создадим Android проект File->New Project->Android Module:

И в layout добавим новый main.xml, на него добавим ListView:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:orientation="horizontal"
              android:layout_width="fill_parent"
              android:layout_height="fill_parent"
        >
    <ListView
            android:id="@+id/lvMain"
            android:layout_width="match_parent"
            android:layout_height="wrap_content">
    </ListView>
</LinearLayout>

ListView — это список элементов.

Шаг 2

Заполнять этот список мы будем при помощи адаптера.

Создаем в src/MainActivity.java и в нем создаем наш адаптер:

package com.example.AndroidListViewExample;

import android.app.Activity;
import android.os.Bundle;
import android.widget.ArrayAdapter;
import android.widget.ListView;

public class MainActivity extends Activity {

    // элементы списка которые будут в него внесены
    String[] colors = { "Красны", "Оранжевый", "Желтый", "Зелёный", "Голубой", "Синий", "Фиолетовый"};

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        // Связываемся с ListView
        ListView list = (ListView) findViewById(R.id.list);

        // создаем адаптер
        ArrayAdapter<String> adapter = new ArrayAdapter<String>
                                           (this, android.R.layout.simple_list_item_1, colors);

        // устанавливаем адаптер списку
        list.setAdapter(adapter);
    }
}

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

Шаг 3

Запускаем и смотрим результат:

Как видите все элементы массива вывелись в список.

Шаг 4

Давайте немного кастомизируем элементы списка.

Создадим layout custom_list_item.xml в папке res/layout нашего проекта:

<?xml version="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:background="#2ECC71"
        android:textColor="#FFFFFF"
        android:textSize="24sp">
</TextView>

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

// создаем адаптер
ArrayAdapter<String> adapter = new ArrayAdapter<String>
                                   (this, R.layout.custom_list_item, colors);

Смотри как это будет выглядеть:

Шаг 5

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

Для этого допишем ClickListener для нашего списка:

// Обработка события на клик по элементу списка
list.setOnItemClickListener(new AdapterView.OnItemClickListener() {
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
        Toast.makeText(getApplicationContext(), "itemClick: position = " +
                position + ", id = " + id + ", " + parent.getAdapter().getItem(position),
                Toast.LENGTH_SHORT).show();
    }
});

И после клика, это выглядит так:

Урок создан: 28 мая 2013 | Просмотров: 21712 | Автор: Александр Барчук | Правила перепечатки


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

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

Ваш e-mail не будет опубликован.

Комментарии:

  • 28 июня 2013 в 02:56

    Ahmad

    Спасибо за урок, а как сделать так, чтоб при клике открылось имеющийся активити. Заранее благодарю

  • 11 августа 2013 в 09:10

    Ромарио

    А как вывести при нажатии название пункта меню?

  • 04 января 2014 в 22:10

    Никита

    Спасибо за урок! Присоединяюсь к вопросу про вызов новой Activity, но как сделать так, чтобы для каждого пункта списка вызывалась своя отдельная Activity? Заранее спасибо

    • 05 января 2014 в 12:52

      Александр Барчук

      Здравствуйте! Вам нужно заране установить элементы списка, Иначе если список генерируется автоматически то такое сделать не получится. А так как элементы списка статично указаны то ничего не мешает на каждый повешать OnItemClickListener и в зависимости от позиции (там будет параметр в методе position) выполнять действие открытия Activity. Как запускать Activity рассказанно тут http://devcolibri.com/418/.

    • 11 марта 2015 в 15:58

      Сергей

      Я сделал через метод if else if
      lvlist.setOnItemClickListener(new AdapterView.OnItemClickListener() {
      @Override
      public void onItemClick(AdapterView parent, View itemClicked, int position,
      long id) {
      if (position==0){
      Intent intent = new Intent(OneActivity.this, MenuActivity.class);
      startActivity(intent);
      }
      else if (position==1){
      Intent intent = new Intent(OneActivity.this, MainActivity.class);
      startActivity(intent);
      }
      Для каждой position устанавливаешь значение, начиная с 0. Сам не ожидал, но работает.

      • 11 апреля 2015 в 01:03

        Костя

        Что именно вписывать там где «OneActivity»

      • 11 апреля 2015 в 02:26

        Костя

        Все разобрался ) Я тебя обожаю!!! я эту информацию очень долго искал!

  • 02 августа 2014 в 10:57

    Макс

    Александр спасибо.. ето урок отлично добавиляет видеоурок п листактивити на ютубе. Круто что показали пример с custom_list_itemб мне было ранее не совсем понятно что ето за параметр.

  • 20 ноября 2014 в 16:11

    Дмитрий

    Здравствуйте Александр, у меня вопрос.
    Я использую SimpleAdapter, передаю ему данные с помощью ArrayList<Map>. В каждый пункт списка передается 3 значения (2 — тексты для TextView и 1 — id изображения для ImageView). В обработчике OnItemClickListener я могу получить содержимое кликнутого пункта (String s = parent.getAdapter().getItem(position).toString();) но такой способ записывает в s что-то типа {textАttribut1=»text1″, textАttribut2=»text2″, imageАttribut3=»01234567890″}. Вопрос, как получить от адаптера одно из значений кликнутого пункта по атрибуту?
    Заранее спасибо.

  • 10 мая 2015 в 14:35

    John

    вот я вместо Toast.makeText поставил Intent переход на страницу, но как сделать так чтобы по разным страницам перешла а не одну страницу на все списки

  • 26 июля 2015 в 21:00

    saintgeo23

    Пожалуйста подскажите, как увеличить расстояние между элементами списка?

  • 29 октября 2016 в 22:08

    Dimon

    Спасибочки за эт: parent.getAdapter().getItem(position),