- Полный список
- Обработка нажатия на отдельный View в элементе списка
- Android ListView Example
- 1. How To Get A ListView Object.
- 2. ListView Properties And Methods.
- 3. ListView ArrayAdapter Example.
- 4. ListView SimpleAdapter Example.
- 5. ListView Custom SimpleAdapter Example.
- 6. ListView Custom BaseAdapter Example.
- ListView в Android: Простое использование
- ListActivity
- Адаптер
- Пример: Простой ListActivity
Полный список
— рассматриваем события ListView: нажатие — onItemClick, выделение — onItemSelect, прокрутка — onScroll
При взаимодействии со списком может возникнуть необходимость обрабатывать события – нажатие на пункт и прокрутка. Попробуем это сделать.
Создадим проект:
Project name: P0441_SimpleListEvents
Build Target: Android 2.3.3
Application name: SimpleListEvents
Package name: ru.startandroid.develop.p0441simplelistevents
Create Activity: MainActivity
Нарисуем экран main.xml:
На экране только ListView.
Так же, как и на прошлом уроке добавим список имен в ресурс res/values/strings.xml:
Пишем код MainActivity.java:
Смотрим код. Мы находим экранные элементы, создаем и присваиваем списку адаптер. Далее списку мы присваиваем два обработчика событий:
1) OnItemClickListener – обрабатывает нажатие на пункт списка
parent – View-родитель для нажатого пункта, в нашем случае — ListView
view – это нажатый пункт, в нашем случае – TextView из android.R.layout.simple_list_item_1
position – порядковый номер пункта в списке
id – идентификатор элемента,
Мы в лог будем выводить id и position для элемента, на который нажали.
2) OnItemSelectedListener – обрабатывает выделение пунктов списка (не check, как на прошлом уроке)
Предоставляет нам метод , android.view.View, int, long)» target=»_blank»>onItemSelected полностью аналогичен по параметрам методу onItemClick описанному выше. Не буду повторяться.
Также есть метод )» target=»_blank»>onNothingSelected – когда список теряет выделение пункта и ни один пункт не выделен.
Все сохраним и запустим приложение.
Ткнем какой-нибудь элемент, например — Петр. Смотрим лог:
itemClick: position = 2, >
Все верно. Т.к. позиция считается не с единицы, а с нуля – Петр имеет позицию 2. (В нашем случае id равен position. Я пока не встречал случаев id != position, но наверняка они есть)
Теперь покрутите колесо мышки или понажимайте клавиши вверх вниз на клавиатуре. Видно что идет визуальное выделение элементов списка.
А в логах мы видим такие записи:
itemSelect: position = 2, > itemSelect: position = 3, > itemSelect: position = 4, > itemSelect: position = 5, > itemSelect: position = 4, > itemSelect: position = 3, > itemSelect: position = 2, >
Т.е. обработчик фиксирует какой пункт выделен. Честно говоря, я не очень понимаю как можно использовать такое выделение. Но обработчик для него есть и я решил про него рассказать. Пусть будет.
Снова нажмем теперь на любой пункт списка, мы видим, что выделение пропало. Логи:
itemSelect: nothing
itemClick: position = 3, >
Ничего не выделено и нажат пункт с позицией 3.
Давайте добавим к списку еще один обработчик:
OnScrollListener – обрабатывает прокрутку списка.
view – это прокручиваемый элемент, т.е. ListView
scrollState – состояние списка. Может принимать три значения:
SCROLL_STATE_IDLE = 0, список закончил прокрутку
SCROLL_STATE_TOUCH_SCROLL = 1, список начал прокрутку
SCROLL_STATE_FLING = 2, список «катнули», т.е. при прокрутке отпустили палец и прокрутка дальше идет «по инерции»
Вывод в лог я пока закаментил, чтобы не мешалось. Чуть позже раскаментим.
view – прокручиваемый элемент
firstVisibleItem – первый видимый на экране пункт списка
visibleItemCount – сколько пунктов видно на экране
totalItemCount – сколько всего пунктов в списке
Причем для параметров firstVisibleItem и visibleItemCount пункт считается видимым на экране даже если он виден не полностью.
Все сохраним и запустим.
Теперь потаскайте список туда-сюда курсором (как будто пальцем) и смотрите логи. Там слишком много всего выводится. Я не буду здесь выкладывать. Но принцип понятен – меняется первый видимый пункт (firstVisibleItem) и может на единицу меняться кол-во видимых пунктов (visibleItemCount).
Теперь закоментируем вывод в лог в методе onScroll (чтобы не спамил нам лог) и раскаментим в onScrollStateChanged.
Схватим список, немного потягаем туда сюда и отпустим. Смотрим лог:
scrollState = 1
scrollState = 0
Отработали два события – список начал прокрутку, список закончил прокрутку.
Попробуем взять список, «катнуть» его и отпустить.
scrollState = 1
scrollState = 2
scrollState = 0
Видим три события – прокрутка началась, список «катнули», прокрутка закончилась.
Полный код урока:
На следующем уроке:
— строим список-дерево ExpandableListView
Присоединяйтесь к нам в Telegram:
— в канале StartAndroid публикуются ссылки на новые статьи с сайта startandroid.ru и интересные материалы с хабра, medium.com и т.п.
— в чатах решаем возникающие вопросы и проблемы по различным темам: Android, Kotlin, RxJava, Dagger, Тестирование
— ну и если просто хочется поговорить с коллегами по разработке, то есть чат Флудильня
— новый чат Performance для обсуждения проблем производительности и для ваших пожеланий по содержанию курса по этой теме
Источник
Обработка нажатия на отдельный View в элементе списка
В этой статье я опишу способ обработки нажатия на отдельную часть элемента списка. Кого заинтересовало, прошу под кат.
ПРЕДИСТОРИЯ
Недавно передо мной встала задача: реализовать возможность нажатия на отдельный View в элементе списка. Сложность заключалась в том, что метод onListItemClick() вызывается при нажатии на любую часть элемента списка (неважно, какой View находится под пальцем). Поискав решение, я ничего полезного не нашёл. Проведя несколько экспериментов, я всё-таки достиг цели.
СОЗДАНИЕ ПРОЕКТА
Создадим проект. Имя, пакет, версия ANDROID – на ваше усмотрение. Сначала разметка для элемента списка и Activity:
Я специально использую ListActivity, чтоб сократить урок. Использовать мы будем, разумеется, свой кастомный адаптер. Чтобы не морочиться с SimpleAdapter и его ArrayList > или BaseAdapter с его обязательными методами, я наследую свой адаптер от ArrayAdapter. Я не стал добавлять ViewHolder – он нам сейчас не нужен. Ну и наконец-то, сам код адаптера:
Давайте разбираться, что мы здесь накодили. В методе getView(int position, View convertView, ViewGroup parent) мы создаём вьюху для каждого элемента списка и там же находим кнопку и присваиеваем ей обработчик нажатия. Когда кнопку нажимают, появляется тост с позицией этого элемента. Как видите, всё очень просто! Правда, при этом почему-то перестаёт работать onListItemClick(ListView l, View v, int position, long id) (по крайней мере у меня). Поэтому придётся кодить обработку нажатия на нужную кнопку и на все остальные View в самом адаптере :(. Но можно сделать, как я написал выше — присвоить всем элементам OnClickListener, а потом смотреть — если наша кнопка, то одно действие, иначе — другое. А ещё лучше вынести все другие вьюхи в отдельный LinearLayout или RelativeLayout и присваивать слушатель только ему.
Ну вот в общем-то и всё. Буду рад, если этот пост поможет кому-нибудь.
Источник
Android ListView Example
android.widget.ListView is widely used in android mobile app. It displays all the list items in the form of a vertical list. This article will show you examples about how to create ListView and how to add item data in it.
1. How To Get A ListView Object.
There are two ways to create a ListView.
- Use android.widget.ListView widget directly.
- Make your activity class extends android.app.ListActivity. Then you can call it’s setAdapter() method to set item data, and it’s onListItemClick() method is used to response list item click action.
After you get the ListView object, you need to add item data in it through Adapter. There are following Adapters that you can use.
You can even use other adapters, but these three adapters are most used. We will show you above adapter examples later.
2. ListView Properties And Methods.
- android:choiceMode : The value can be singleChoice (can only select one item ), multipleChoice( can select multiple item ) or none.
- android:divider : It is a color or drawable object id, used to set divider color.
- android:dividerHeight : Set the divider height.
- android:entries : The value is a array resource id defined in android studio. The array data will be shown in the ListView.
- android:headerDividersEnabled : Boolean value, true means draw divider after header view.
- android:footerDividersEnabled : Boolean value, true means draw divider before footer view.
- setOnItemClickListener() : Set OnItemClickListener object which will response to ListView item click event.
3. ListView ArrayAdapter Example.
If you can not watch the above video, you can see it on the youtube URL https://youtu.be/c5Fv78xCI6M
activity_list_view.xml
ListViewActivity.java
Please note the second parameter for ArrayAdapter constructor can have below values.
- simple_list_item_1 : Each list item is a TextView object.
- simple_list_item_2 : Each list item is a TextView object, text size is bigger.
- simple_list_item_checked : Each list item is a checked checkbox.
- simple_list_item_single_choice : Display a radio button in the right of each list item. Even it is a radio button, it can be multiple checked if ListView’s android:choiceMode value is multipleChoice.
- simple_list_item_multiple_choice : Display a checkbox in the right of each list item. Even it is a checkbox, it can be single checked if ListView’s android:choiceMode value is singleChoice.
4. ListView SimpleAdapter Example.
If you can not watch the above video, you can see it on the youtube URL https://youtu.be/9BYH4Ftclv0
activity_list_view.xml
ListViewActivity.java
Please note the SimpleAdapter creation code. There are 5 parameters in the SimpleAdapter constructor.
- First parameter : This is the context object that this SimpleAdapter will be used with.
- Second parameter : This is a List > object, each map object in the list represent a ListView item data.
- Third parameter : This is the ListView’s item UI component layout xml. It decides which UI components will be shown in each ListView item.
- Fourth parameter : This String array contains map object’s keys. Each key related map value will be shown in the ListView item.
- Fifth parameter : This int array contains the view object’s resource id in item layout xml file(second parameter specified). Each view object will display related value extracted from map object use keys( fourth parameter specified) by order.
5. ListView Custom SimpleAdapter Example.
This example will customize a SimpleAdapter object which use self defined ListView item layout to add a picture at the beginning of each ListView item.
If you can not watch the above video, you can see it on the youtube URL https://youtu.be/XJOX6qtZuxk
activity_list_view.xml
ListViewActivity.java
6. ListView Custom BaseAdapter Example.
If you still need more customization for ListView item. You can use android.widget.BaseAdapter. Override it’s getCount() and getView() method.
This example set different item row background color and add a button for each item row.
Источник
ListView в Android: Простое использование
Блуждал в Интернете в поисках достойного мануала. Нашел, по моему мнению, достойный, но, как водится в кругах программирования под Android он, конечно же, на английском. Вот и решил привнести свой вклад в распространение мануалов в этой среде на русском. Буду его изучать и, попутно, переводить сюда.
Напомню, что статья является переводом этой статьи с разрешения ее автора.
Продолжение статьи находится здесь. В нем рассматривается кастомизация списков и советы по их оптимизации.
Мануал написан под Android 4, Eclipse 3.7, Java 1.6. Источник можно найти здесь.
Списки — это вещь обычная в современных мобильных устройствах. Мы можем перемещаться по списку и выбирать нужный нам элемент, чтобы открыть что-то. Так и у Андроида он имеется.
ListActivity
Вы можете напрямую использовать ListView в своем проекте, как и любой другой компонент интерфейса пользователя. Если основная цель вашей Деятельности это отображение списка, то вы можете расширить класс Activity классом ListActivity, что значительно упростит использование ListView.
ListActivity расширяет Activity, чтобы упростить использование списков. Например, у вас уже будет предопределенный метод, обрабатывающий нажатие на элемент списка.
ListActivity содержит ListAdapter, ответственный за управление содержимым. Адаптер должен быть установлен в методе onCreate() вашей деятельности через метод setListAdapter().
При нажатии на элемент списка вызывается метод onListItemClick(). Этот метод позволяет получить доступ к выбранному элементу.
В Андроиде уже есть некоторые предопределенные шаблоны для использования в Адаптере, например «android.R.layout.simple_list_item1». Если же вы не хотите использовать предопределенный шаблон, ваш шаблон должен иметь идентификатор «@android:id/list», который будет называться ListView. Например:
Так же вы можете использовать вид с id «@android:id/empty». Этот вид отображается, когда список пуст.
Адаптер
Что такое Адаптер?
ListView берет содержимое для отображения через адаптер. Адаптер расширяется классом BaseAdapter и отвечает за модель данных для списка и за расположение этих данных в его элементах.
В Андроиде есть два стандартных адаптера: ArrayAdapter и CursorAdapter. ArrayAdapter управляет данными, основанными на массивах или списках, в то время, как SimpleCursorAdapter управляет содержимым из базы данных. Так же вы можете разработать свой Адаптер, расширяющий эти два класса или же класс BaseAdapter.
Самый важный метод Адаптера — getView(). Он вызывается для каждого элемента списка, чтобы определить как и какие данные должны в нем отображаться. getVew() так же содержит параметр convertView, который позволяет использовать заново уже существующий элемент списка, который уже не отображается, т.к. пользователь пролистнул его с видимой части дисплея. Если convertView не пустой, он может быть использован заново, чтобы не грузить шаблон, что приводит к значительному приросту производительности, т.к. подгрузка XML файла достаточно ресурсоемка.
ListViews и производительность
Отображение большого количества данных на мобильном устройстве должно быть реализовано максимально эффективно. Поэтому ListView создает виды (виджеты) по необходимости и подкрепляет их к иерархии видов. Стандартный Адаптер ListView удаляет виды, например, если элемент больше не отображается, он будет стерт и только его содержимое поменяется. Если вы используете свой адаптер, то вы должны так же предусмотреть это, чтобы избежать проблем с производительностью.
Пример: Простой ListActivity
Сейчас мы создадим максимально простой список. Мы используем стандартный класс Adapter — ArrayAdapter и вид, предопределенный Андроидом.
Создайте новый проект «de.vogella.android.listactivity» с Деятельностью «MyListActivity». Не изменяйте шаблон main.xml. Создайте следующую Деятельность:
Заметьте, что мы не используем setContentView(). ListActivity использует шаблон ListView по-умолчанию, если другой шаблон не задан явно.
По нажатию одного из элементов списка будет выводиться стандартный «Тост» с информацией какой из элементов был выбран.
Прошу прощения за репост. Изначально не отметил как перевод. Большое спасибо jeston за наводку, принял и научился на ошибках.
Источник