Лист и список Android (списки)

Лист и список Android (списки) Портал РЖД

ListView не реагирует на нажатия

В некоторых случаях нажатия на пунктах меню не срабатывают. Ниже приводятся несколько возможных причин.

Элемент списка содержит CheckBox, который также имеет свой слушатель нажатий. Попробуйте удалить фокус у него:

Попробуйте переместить OnItemClickListener перед установкой адаптера. Иногда помогает.

Элемент списка содержит ImageButton. Установите фокус в false:

ImageButton imageButton = (ImageButton) convertView.findViewById(R.id.imageButton);
imageButton.setFocusable(false);

Элемент списка содержит TextView. Если вы используете атрибут android:inputType=»textMultiLine», то замените его на android:minLines/android:maxLines.

Элемент списка содержит TextView, содержащий ссылку на веб-страницу или электронный адрес. Удалите атрибут android:autoLink.

Xls file viewer

XLSX viewer: XLS file viewer & Reader – это мобильное приложение на андроид, предназначенное для открытия и чтения форматов XLS и XLSX (то есть созданных в Excel). Оно правильно открывает таблицы с любым содержанием, даже если в них много графиков, диаграмм и других сложных для форматирования объектов в соответствии с телефонным экраном. Здесь качественно настроены функции поиска, перемещения по документу, перелистывание страниц и многое другое.

Помимо просмотра самого файла, в приложении можно посмотреть анализ содержащихся в нем данных. Есть и минимальный функционал редактирования: можно что-нибудь создать, удалить, скопировать, перенести, добавить, но более серьезных опций не предусмотрено.

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

Google Таблицы

Google Таблицы – это бесплатное приложение на андроид, предназначенное для работы с таблицами. Функционал позволяет:

Подсветка нажатий

На данный момент используется следующая техника подсвечивания элементов списка при нажатии. Здесь учитывается версия Android (до и после API 21).

Res/values/colors. xml

Разница заключается в том, что в версии 21 рекомендуется использовать серый цвет с применением ripple.

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

Создадим стиль для планшетов.

Res/values-sw600dp/styles. xml

А в обычном styles.xml оставим заглушку.

Теперь применим стиль к списку и нужное поведение с активацией будет применяться только на планшетах.

При повороте выбранный пункт списка может оказаться за пределами экрана. С помощью метода smoothScrollToPosition() мы можем автоматически прокрутить список к нужному месту. Код показан в продвинутых приёмах.

Каталог безопасных российских мобильных приложений для Android

Это приложение предлагает вам ознакомиться с каталогом отечественного мобильного ПО, рекомендованного к установке на смартфоны и плагшеты на Андроид. Каталог разбит на категории, что сделает поиск необходимого ПО проще и удобнее. Все программы в каталоге распространяются бесплатно и совершенно безопасны. Каталог включает в себя следующие разделы:

Если вы точно знаете, что ищете, воспользуйтесь функцией поиска по всему каталогу или выбранным категориям.

Особенности программы

APP List на APKshki.com скачали 2414 раз. APP List распространяется бесплатно в расширении apk.

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

Создание таблиц и работа с ними

Microsoft Excel: создание таблиц и работа с ними – это приложение на андроид для полноценной работы с таблицами, аналог компьютерной программы Microsoft Excel. Здесь можно:

Прослушивание событий элемента ListView

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

В этом нам поможет метод setOnItemClickListener элемента ListView и метод OnItemClick() интерфейса AdapterView.OnItemClickListener.

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

Естественно, мы можем не только выводить сообщения, но и запускать новые активности и т.п.

В метод onItemClick() передаётся вся необходимая информация, необходимая для определения нажатого пункта в списке. В приведенном выше примере использовался простой способ — приводим выбранный элемент к объекту TextView, так как известно, что в нашем случае все пункты являются элементами TextView (Для дополнительной проверки можете использовать оператор instanceOf). Мы извлекаем текст из выбранного пункта и сравниваем его со своей строкой.

Также можно проверять атрибут id для определения нажатия пункта списка.

Функции

У многих функций есть суффиксы To, By, With: associate, associateTo, associateBy, associateByTo, associateWith, associateWithTo.

В некоторых примерах используются объекты класса Cat.

data class Cat(
val name: String,
val age: Int,
val weight: Int
)

Настраиваем внешний вид ListView

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

Далее присвоим созданный ресурс атрибуту divider, а также зададим его высоту в атрибуте dividerHeight у нашего элемента ListView:

Лист и список Android (списки)

Если вас не устраивает стандартный разделитель, что можете нарисовать какую-нибудь волнистую черту, сохранить ее в PNG-файле и использовать как drawable-ресурс. Проделайте это самостоятельно.

Можно работать с данными атрибутами программно:

ColorDrawable divcolor = new ColorDrawable(Color.DKGRAY);
listView.setDivider(divcolor);
listView.setDividerHeight(2);

Если хотите убрать разделители, то используйте прозрачный цвет.

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

Обратите внимание, что по умолчанию разделитель не выводится перед первым и последним элементом списка. Если вы хотите изменить эти настройки, то используйте свойства Footer dividers enabled (атрибут footerDividersEnabled) и Header dividers enabled (атрибут headerDividersEnabled):

Упражнения для коллекций

Ответы на упражнения

Имеется список, некоторые элементы которого повторяются несколько раз. Найти самый повторяемый элемент.

Реклама

Производительность для списков — convertView, ViewHolder

Списки со значками

Список с использованием HashMap и объектов (SimpleAdapter)

Список с двустрочным текстом, разными значками и адаптером SimpleAdapter

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

Android: ListFragment. Основы

Список с множественным выбором и собственным адаптером ArrayAdapter

Множественный выбор и щелчок для перехода (закрытая зона/2-й курс)

Полосатый ListView (BaseAdapter, значки) (закрытая зона/3-й курс)

Фильтруем базар. Поиск по списку (закрытая зона/3-й курс)

Фильтруем базар. Поиск по списку с помощью SearchView (закрытая зона/3-й курс)

Фильтруем базар. Поиск по тексту (Часть 1 и 2) (закрытая зона/3-й курс)

Фильтруем базар. Поиск по тексту, загруженному с сервера (XMLParser) (Часть 4) (закрытая зона/4-й курс)

Загружаем элементы списка из интернета (закрытая зона/3-й курс)

Используем RatingBar в списках (закрытая зона/3-й курс)

Список с разными типами разметки для каждого элемента списка (закрытая зона/5-й курс)

Разбиваем список на секции с заголовками (закрытая зона/5-й курс)

Продвинутые примеры с ListView

ArrayDeque (Kotlin 1. 70)

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

Функция использует параметры по умолчанию, поэтому часть параметров можно опускать.

Знакомьтесь — ListView

ListView на Kotlin

В ранних версиях Android компонент ListView был одним из самым популярных элементов интерфейса. Но теперь его время ушло, недаром на панели инструментов студии он находится в разделе Legacy (устаревший код).

ListView представляет собой прокручиваемый список элементов. Очень популярен на мобильных устройства из-за своего удобства. Даже кот способен пользоваться этим элементом, проводя лапкой по экрану вашего телефона.

Лист и список Android (списки)

Компонент ListView более сложен в применении по сравнению с TextView и другим простыми элементами. Работа со списком состоит из двух частей. Сначала мы добавляем на форму сам ListView, а затем заполняем его элементами списка.

Рассмотрим для начала самый простой пример. Поместите на форму компонент ListView и присвойте идентификатор. Вы увидите, что список будет содержать несколько элементов Item и Sub Item.

Лист и список Android (списки)

Однако, если посмотрим XML-код, то там ничего не увидим.

Переходим в класс активности и пишем следующий код:

Вот и всё. Давайте разберёмся с кодом.

Зачем нужны списки

У сильной независимой женщины Наташи проживает сорок (!) котов. Аккуратная хозяйка решила записать имена котов в тетрадку.

Мои ненаглядные коты

Наташа немного знакома с программированием и решила вести учёт в электронном виде, написав собственную программу под Android.

Первоначальный вариант был следующим.

val cat1 = «Мурзик»
val cat2 = «Рыжик»
val cat3 = «Барсик»

println(cat1)
println(cat2)
println(cat3)

В какой-то момент, Наташе надоело писать такой код. Для каждого кота нужно заводить отдельную переменную, при этом сложно следить за порядком, если захочется поменять местами Рыжика и Барсика, сделав их котами под номерами 3 и 2.

К счастью, существуют коллекции. Список является распространённым вариантом коллекции. Создадим список котов через функцию listOf().

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

Поговорим о добавлении и удалении элементов из списка. Когда мы создаём список при помощи listOf(), то получаем неизменяемый список. В таком списке нельзя ничего добавить или убавить. Но как же быть, если у Наташи появился новый кот? Мы можем создать новый список, взяв старый список и добавив новый элемент.

val newMyLovelyCats = myLovelyCats + «Васька»

println(newMyLovelyCats)

Нам пришлось создавать второй список при попытке добавить новый элемент. Не слишком удобно, но мы можем кое-что изменить. Список является неизменяемым в любом случае, даже если бы мы объявили переменную как var. Но тем не менее var поможет присвоить значение нового списка уже созданной раннее переменной.

var myLovelyCats = listOf( // Переменная Мои ненаглядные коты
«Мурзик», // первый кот в списке
«Рыжик»,
«Барсик», // последний кот в списке
)

myLovelyCats = myLovelyCats + «Васька»

println(myLovelyCats)

Это можно представить как Наташа вырывает лист из блокнота и выбрасывает его, и заново пишет в блокноте старый список, приписывая нового кота.

По такому же принципу мы можем удалять элементы списка, используя минус вместо плюса. Наташа отдала своего Рыжика подружке Тане.

myLovelyCats = myLovelyCats — «Рыжик»

Мы можем прибавлять и отнимать одновременно.

var myLovelyCats = listOf( // Переменная Мои ненаглядные коты
«Мурзик», // первый кот в списке
«Рыжик»,
«Барсик», // последний кот в списке
)

myLovelyCats = myLovelyCats + «Васька» — «Рыжик»

println(myLovelyCats)

Но подобный подход расходует слишком много ресурсов, особенно, если список очень большой. Нам приходится создавать второй такой же список, который будет занимать ограниченную память. К счастью, есть альтернативный вариант — изменяемые списки. Изменяемый список MutableList создаётся при помощи функции mutableListOf. Удалять и добавлять элементы в изменяемом списке можно через функции add() и remove().

val myLovelyCats = mutableListOf( // Переменная Мои ненаглядные коты
«Мурзик», // первый кот в списке
«Рыжик»,
«Барсик», // последний кот в списке
)

myLovelyCats.add(«Васька»)
myLovelyCats.remove(«Рыжик»)

println(myLovelyCats)

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

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

// второй элемент списка
println(myLovelyCats.get(1))

Тут главное не переборщить и не указать слишком большое число для индекса. Если у Наташи сорок котов, а вы укажете индекс 42 (ответ на главный вопрос жизни, вселенной и всего такого), то получите ошибку — исключение ArrayIndexOutOfBoundsException.

Можно не вызывать функцию get(), а сразу указать номер индекса в квадратных скобках.

Следующий важный момент — вывести все элементы на экран. Инструкция println(myLovelyCats) выводит все элементы в одну строку. Но удобнее видеть элементы с каждой новой строки. Можно последовательно выводить элементы следующим образом.

Для небольших списков такой способ не критичен. Но если у нас сорок элементов, то печатать 40 раз похожий код утомительно. У списков есть функция перебора элементов — forEach(), которая сама пройдётся по всем элементам списка.

Если мы объявляем изменяемый список без инициализации, то обязательно указываем тип данных. Иначе компилятор не поймёт, что мы хотим использовать.

Операции с двумя списками

С помощью addAll() можно добавить в список элементы другого списка.

Другой способ — функция plusAssign():

Вычитать элементы одного списка при помощи элементов другого списка можно через minusAssign().

Ещё один способ объединения двух списков с сохранением только уникальных элементов через union(). Обратите внимание на порядок сохранения — сначала берутся элементы основного списка, а затем добавляются элементы добавляемого списка.

val listA = mutableListOf(«a», «e», «b»)
val listB = mutableListOf(«a», «c», «d», «e», «f»)
val listC = listB.union(listA)
println(listC)

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

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

Допустим и такой вариант.

Интересный случай с использованием += и -=. В этом случае следует использовать var, так как мы изменяем список.

ReplaceAll (Kotlin 1

Заменяет каждый элемент списка новым значением в результате заданного выражения. Доступно для API 24 и выше

Fill (Kotlin 1

Заменяет все элементы списка заданным значением.

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

Например, найдём последний элемент из коллекции.

val set = setOf(«Васька», «Мурзик», «Барсик»)
println(set.last())

Множественный выбор

Вы можете использовать список с множественным выбором. Модификация минимальна, просто установите нужный режим у ListView.

Listfragment. xml

В классе фрагмента напишем код, заменив системную разметку на simple_list_item_multiple_choice.

Лист и список Android (списки)

Сам ListFragment отдельно использовать смысла нет, поэтому во второй части рассмотрим пример с двумя фрагментами.

JazzyListView — эффекты при листании списка

Когда прокрутка достигает конца (сверху или снизу), то выводится цветовой эффект. В API 21 появилась возможность управлять этим эффектом через атрибут colorEdgeEffect:

Далее применяем как тему.

Для более старых устройств такую настройку сделать нельзя.

Пользовательский селектор

Мы уже видели, что по умолчанию выбранный элемент списка выделяется при помощи цветной полоски. Данный селектор также можно настроить через атрибут android:listSelector. Создайте какую-нибудь текстуру для селектора и привяжите его через ресурс. Вот образец текстурированного ореола желтого цвета для селектора.

Лист и список Android (списки)

Нужно подготовить сначала файл res/drawable/selector.xml:

Если вам нужно сразу подсветить нужный элемент списка при запуске программы, то используйте связку двух методов:

listView.requestFocusFromTouch();
listView.setSelection(4); // выбираем 5 пункт списка

Собственная разметка

В примере мы используем готовую системную разметку android.R.layout.simple_list_item_1, в которой настроены цвета, фон, высота пунктов и другие параметры. Но нет никаких препятствий самому создать собственную разметку под своё приложение.

Но для начала неплохо бы взглянуть на содержание системной разметки. Студия позволяет увидеть исходный код, достаточно в коде поставить курсор на simple_list_item_1 и нажать на комбинацию клавиш Ctrl+B. Наш simple_list_item_1 выглядит так (в одной из версий):

Мы видим, что в качестве разметки используется TextView с набором атрибутов.

Если говорить о системных разметках, то имеется несколько вариантов. Вкратце ознакомимся с ними.

Android. layout. simple_list_item_1

Состоит из одного TextView (см. выше)

Android. layout. simple_list_item_2

Состоит из двух TextView — один побольше сверху и второй поменьше под ним.

Android. layout. simple_list_item_checked

Справа от CheckedTextView будет находиться флажок

Android. layout. activity_list_item

Слева от TextView находится значок ImageView с идентификатором android.resource.id.Icon.

Создадим свой шаблон для отдельного пункта списка. Для этого в папке res/layout/ создадим новый файл list_item.xml:

В некоторых случаях желательно установить атрибут android:background=»?android:attr/activatedBackgroundIndicator» у родительского элемента, чтобы элементы списка реагировали на нажатие изменением цвета. Можно задать и собственное поведение.

Вы можете настраивать все атрибуты у TextView, кроме свойства Text, так как текст будет автоматически заполняться элементом ListView программным путём. Ну, а дальше просто меняете в коде системную разметку на свою:

При создании собственного элемента списка, состоящего из TextView можете использовать специальный стиль для минимального размера текста.

Нет данных для отображения

Если адаптер не содержит данных для отображения, то можете вызвать метод для показа пустой разметки:

В подвалах часто живут коты, поэтому списки желательно также снабжать подвалом (и шапкой). У ListView есть такая возможность, давайте воспользуемся этим.

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

Полный варианты методов:

addHeaderView (View v, Object data, boolean isSelectable)
addFooterView (View v, Object data, boolean isSelectable)

Интересно, что до версии API 19 шапку и подвал можно было добавлять только до присвоения списку адаптера, иначе возникала ошибка. Теперь можно добавлять в любое время, ошибки не будет и список будет работать.

Для демонстрации подойдёт любой урок со списком. Дополнительно добавим два файла для шапки и подвала (можно также воспользоваться системной разметкой). Если по структуре шапка и подвал одинаковы, то можно обойтись и одним файлом. Но для разнообразия сделаем их немного разными.

Res/layout/list_header. xml

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

Никто не запрещает использовать несколько шапок и подвалов в списке. Соответствующий код закомментирован.

Шапка состоит из двух текстовых меток. В первой метке текст задан в макете, а во второй текст устанавливается программно. Подвал сделан ещё проще — только одна метка, текст задан в макете. Естественно, вы можете реализовать более сложный макет в вашем приложении.

Шапку и подвал можно удалить программно через методы removeHeaderView() и removeFooterView().

Лист и список Android (списки)

Таблица заметки – Мобильная карманная база данных

«Таблица заметки – Мобильная карманная база данных» – это бесплатное приложение для андроид, предназначенное для работы с информацией, оформленной в таблицы. Здесь можно:

Благодаря синхронизации с другими пользователями и широкому функционалу, здесь с удобством можно:

Программное нажатие на элемент списка

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

Код громоздкий, но работоспособный.

Также множественный выбор можно установить программно при помощи метода setChoiceMode(ListView.CHOICE_MODE_MULTIPLE).

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

Лист и список Android (списки)

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

Лист и список Android (списки)

Если нужно получить отдельно список выбранных и невыбранных элементов списка, то можно написать следующее:

Переменная checked будет содержать список выбранных элементов, а переменная unchecked — список невыбранных элементов.

Следует отметить, что в примерах использовался старый метод getCheckedItemPositions(), доступный с Android 1. В Android 2.2 появился новый метод getCheckedItemIds(). Учтите, что с новым методом можно получить массив только выбранных элементов, хотя в большинстве случаев этого достаточно. Но данный метод требует своих заморочек и в данном моём примере он не заработал.

Адаптеры — заполнение списка данными

Компоненту ListView требуются данные для наполнения. Источником наполнения могут быть массивы, базы данных. Чтобы связать данные со списком, используется так называемый адаптер.

Метод setAdapter(ListAdapter) связывает подготовленный список с адаптером.

Переходим к java-коду. Сначала мы получаем экземпляр элемента ListView в методе onCreate(). Далее мы определяем массив типа String. И, наконец, используем адаптер данных, чтобы сопоставить данные с шаблоном разметки. Выбор адаптера зависит от типа используемых данных. В нашем случае мы использовали класс ArrayAdapter.

Отступление

Если вы будете брать строки из ресурсов, то код будет таким:

И тогда в коде используйте для объявления массива строк:

Запустив проект, вы увидите работающий пример прокручиваемого списка. Правда, созданный список пока не реагирует на нажатия. Но при нажатии выбранный элемент выделяется цветным прямоугольником (в версии Android 2.3 был оранжевый, а в Android 4.0 — синий, потом был серый цвет и т.д.).

Лист и список Android (списки)

Оцените статью
Портал РЖД - Помощь