Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Лабораторные работы / ЛБ Android Studio / 12_Прокручиваемый_список

.doc
Скачиваний:
14
Добавлен:
17.06.2023
Размер:
535.04 Кб
Скачать

ListActivity - создаём прокручиваемый список

Очень часто экран приложения состоит из обычного прокручиваемого списка. Например, это может быть список контактов, дни месяца, ассортимент товара, технические характеристики модели и так далее. Android позволяет создать такой список за пару минут.

В предыдущих примерах мы встречали в коде строчку public class HelloWorld extends Activity, что означало наследование от специального класса Activity. Существует ещё один специальный класс ListActivity, специально разработанный для списков.

Шаг первый.

Создадим новый стандартный проект типа Hello, World. Мы знаем, что этом проекте есть файл main.xml, отвечающий за разметку элементов на экране. Класс ListActivity разработан таким образом, что на экране есть только прокручиваемый список и ему не нужна дополнительная разметка. Поэтому набираемся смелости, выбираем в папке res/layout файл main.xml и через правую кнопку мыши удаляем его.

Шаг второй.

Всё пропало! Теперь ничего не запустится! Don't panic! Открываем java-файл и видим, что Eclipse ругается на строчкуsetContentView(R.layout.main);, что вполне объяснимо. Мы ведь только что сами удалили файл разметки. Ещё раз набираемся смелости и удаляем эту строчку, она там тоже больше не нужна.

Шаг третий.

Теперь нужно поставить Android в известность, что мы собираемся использовать экран со списком, поэтому меняем в строчке public class ВашеНазваниеActivity extends Activity слово Activity на ListActivity. Eclipse прикинется дурачком и подчеркнёт незнакомое ему слово. Подводим к слову указатель мыши и ждём появления всплывающей подсказки. Выбираем первый вариант Import 'ListActivity' (android.app).

В результате в секции import нашего файла появится новая строка. Там же мы увидим строку, которую можно безболезненно удалить:

Шаг четвёртый

Подготовительные работы закончены. Теперь пришло время подготовить сам список для отображения его на экране. Создадим массив строк:

К слову сказать, вы можете создать массив строк в ресурсах, в этом случае вам будет проще редактировать список, не затрагивая код программы. Когда наберётесь опыта, то сами решите, какой вариант лучше.

Шаг пятый.

А теперь начинается самое важное. У нас есть намерение создать экран со списком и сами слова для списка. Необходим некий посредник, который свяжет эти звенья в одно целое. Для подобных целей в Android существует понятие адаптера данных и его определение выглядит так:

Адаптеру нужно от вас три вещи: текущий контекст, идентификатор ресурса с разметкой для каждой строки, массив строк.

Мы можем ему предложить ListActivity в качестве текущего контекста (можно использовать ключевое слово this), готовый системный идентификатор ресурса и созданный массив строк. А выглядеть это будет так:

Обратите внимание на строчку android.R.layout.simple_list_item_1. В ней уже содержится необходимая разметка для элементов списка, если вас не устраивает системная разметка, то можете создать собственную разметку в xml-файле и подключить её.

Шаг шестой.

Осталось сделать заключительный штрих - подключить адаптер:

Запускаем проект и любуемся своим списком. Он прекрасно прокручивается и каждый пункт подсвечивается при нажатии.

Обработка нажатий в списке.

Но пока приложение никак не реагирует на наши нажатия. Исправим ситуацию. Нам нужно знать, на каком пункте списка осуществляется нажатие. Для этой цели существует специальный интерфейс OnItemClickListener с методомonItemClick(). Вот как это делается в Eclipse - набираем название интерфейса

Когда Eclipse подчеркнёт первое слово, то импортируем нужный класс. Далее подведём курсор ко второму слову new OnItemClickListener. Нам будет предложено добавить метод (Add unimplemented method). Соглашаемся и получаем заготовку:

В методе onItemClick() вы видите четыре аргумента с малоинформативными именами arg0, arg1, arg2, arg3. Возьмите за правило менять их на более вменяемые имена:

Очень часто в книгах, на форумах, в чужом коде вы будете видеть именно такой код, в котором понятно, что parentуказывает на родителя, v на элемент View, position - позицию элемента в списке, а id - его идентификатор.

Осталось только прописать код для события - давайте выведем всплывающее сообщение, который будет содержать текст выбранного элемента списка.

Нужно сообщить окну, что ему нужно следить на нажатиями пользователя:

Запускаем программу и начинаем щёлкать по любой позиции списка - мы получим соответствующее сообщение. Вы можете использовать свой код - вызывать новое окно, проигрывать музыку и т.д.

На самом деле существует ещё метод onListItemClick(). Сейчас я стараюсь использовать именно его. Сравните два фрагмента кода.

Второй код лаконичнее и проще набрать через автозаполнение.

Долгое нажатие и удаление элемента списка

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

Для долгого нажатия существует интерфейс OnItemLongClickListener с методом onItemLongClick(), практически совпадающий с интерфейсом для простого нажатия. Различие заключается в том, что добавлено слово Long и метод возвращает значение. Так как мы собираемся обрабатывать долгие нажатия, то строчку return false; необходимо заменить на return true;.

Далее внесём небольшое изменение в адаптер данных. Сам по себе массив строк является неизменяемым, и чтобы мы могли удалять пункты из списка, необходимо сконвертировать его в специальный объект ArrayList<String>, который является изменяемым, а уже новый объект мы отдадим адаптеру:

Далее прописываем необходимый код для удаления выбранного пункта меню и запускаем программу. Прокручивая список, с удивлением замечаем, что среди кошачьих имён затесался какой-то пёсик Бобик. Пробуем удалить его. Получилось! Теперь наш список выглядит правильно.

На всякий случай еще раз просмотрите список и если увидите чужеродное имя, то удалите его.

Заключение.

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

Своя разметка

Когда в самом начале статьи я говорил, что для ListActivity не нужен шаблон main.xml, то немножко лукавил. На самом деле вы можете подключить свой шаблон, но с одним условием - шаблон должен содержать элемент ListView с идентификатором @android:id/list.

Можно заново создать файл main.xml, если вы его удалили, как вас просили, или файл с другим именем, например, customlist.xml:

Я специально установил зелёный цвет для фона, чтобы вы поверили, что будет запускаться наш шаблон вместо системного, а TextView нужен для отображения текста, если список будет пустым. Осталось добавить строчку кода, который подключает шаблон:

Запустите проект и убедитесь, что загружается наш шаблон. Если вы зададите пустой массив, то вместо списка вы увидите TextView с текстом List is Empty.

Переключаемся между двумя списками.

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

Мы создали два адаптера через массивы строк. Сначала используем первый адаптер. При выборе элемента списка через метод onListItemClick() подключаем другой адаптер. Чтобы изменения отразились на экране, неоходимо вызвать метод notifyDataSetChanged().