Android listview

Знайомтеся - ListView

Android listview

Знаходиться в розділі Containers.

Компонент ListView складніший в застосуванні в порівнянні з TextView і іншим простими елементами. Робота зі списком складається з двох частин. Спочатку ми додаємо на форму сам ListView. а потім заповнюємо його елементами списку.

Розглянемо для початку найпростіший приклад. Помістіть на форму компонент ListView і надайте ідентифікатор. Ви побачите, що список буде містити кілька елементів Item і Sub Item.

Android listview

Однак, якщо подивимося XML-код, то там нічого не побачимо.

Переходимо в клас активності і пишемо в методі onCreate () наступний код:

От і все. Давайте розберемося з кодом.

Адаптери - заповнення списку даними

Компоненту ListView потрібні дані для наповнення. Джерелом наповнення можуть бути масиви, бази даних. Щоб зв'язати дані зі списком, використовується так званий адаптер.

Адаптер для стандартного списку зазвичай створюється за допомогою конструкції new ArrayAdapter (Context context, int textViewResourceId, String [] objects).

  • context - поточний контекст
  • textViewResourceId - ідентифікатор ресурсу з розміткою для кожного рядка. Можна використовувати системну розмітку з ідентифікатором android.R.layout.simple_list_item_1 або створити власну розмітку
  • objects - масив рядків

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

Переходимо до java-коду. Спочатку ми отримуємо примірник елемента ListView в методі onCreate (). Далі ми визначаємо масив типу String. І, нарешті, використовуємо адаптер даних, щоб зіставити дані з шаблоном розмітки. Вибір адаптера залежить від типу використовуваних даних. У нашому випадку ми використовували клас ArrayAdapter.

відступ

Якщо ви будете брати рядки з ресурсів, то код буде таким:

А буде ще краще, якщо ви скористаєтеся спеціально призначеним для цього випадку типом ресурсу . У файлі res / values ​​/ strings.xml додайте наступне:

Запустивши проект, ви побачите працюючий приклад прокручуваного списку. Правда, створений список поки не реагує на натискання. Але при натисненні вибраний елемент виділяється кольоровим прямокутником (у версії Android 2.3 був помаранчевий, а в Android 4.0 - синій, потім був сірий колір і т.д.).

Android listview

власна розмітка

У прикладі ми використовуємо готову системну розмітку android.R.layout.simple_list_item_1. в якій налаштовані кольори, фон, висота пунктів та інші параметри. Але немає ніяких перешкод самому створити власну розмітку під свій додаток.

Ми бачимо, що в якості розмітки використовується TextView з набором атрибутів.

Якщо говорити про системні розмітку, то є кілька варіантів. Коротенько ознайомимося з ними.

android.R.layout.simple_list_item_1

Складається з одного TextView (див. Вище)

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

У деяких випадках бажано встановити атрибут android: background = "? Android: attr / activatedBackgroundIndicator" у батьківського елементу, щоб елементи списку реагували на натискання зміною кольору. Можна задати і власну поведінку.

Ви можете налаштовувати всі атрибути у TextView. крім властивості Text. так як текст буде автоматично заповнюватися елементом ListView програмним шляхом. Ну, а далі просто міняєте в коді системну розмітку на свою:

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

Динамічне заповнення списку

Розглянемо приклад динамічного заповнення списку, коли список спочатку порожній і користувач сам додає нові елементи. Розмістимо на екрані текстове поле, в якому користувач буде вводити відомі йому імена котів. Коли користувач буде натискати на клавішу Enter на клавіатурі, то введене ім'я кота буде потрапляти в список.

Android listview

У нас вийшов каркас для чату, коли користувач вводить текст і він потрапляє в список. Далі треба отримати текст від іншого користувача і також додати в список. До слова сказати, слово chat з французької означає "кішка". Але це вже зовсім інша історія.

Прослуховування подій елемента ListView

Нам потрібно реагувати на певні події, які генеруються елементом ListView. зокрема, нас цікавить подія, яке виникає, коли користувач натискає на один з пунктів списку.

У цьому нам допоможе метод setOnItemClickListener елемента ListView і метод OnItemClick () інтерфейсу AdapterView.OnItemClickListener.

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

Природно, ми можемо не тільки виводити повідомлення, але і запускати нові активності і т.п.

У метод onItemClick () передається вся необхідна інформація, необхідна для визначення натиснутого пункту в списку. У наведеному вище прикладі використовувався простий спосіб - наводимо обраний елемент об'єкта TextView. так як відомо, що в нашому випадку всі пункти є елементами TextView (Для додаткової перевірки можете використовувати оператор instanceOf). Ми витягуємо текст з обраного пункту і порівнюємо його з своїм рядком.

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

Програмне натискання на елемент списку

Раптом вам захочеться програмно натиснути на елемент списку. Ми задали код, який буде виконуватися при натисканні, в попередньому прикладі. Тепер додамо кнопку і напишемо код для клацання.

Код громіздкий, але працездатний.

ListView не реагує на натискання

У деяких випадках натискання на пунктах меню не спрацьовують. Нижче наводяться кілька можливих причин.

Приклад містить CheckBox. який також має свій слухач натискань. Спробуйте видалити фокус у нього:

Спробуйте перемістити OnItemClickListener перед установкою адаптера. Іноді допомагає.

Приклад містить ImageButton. Помістіть об'єкт у фокус в false:

Приклад містить TextView. Якщо ви використовуєте атрибут android: inputType = "textMultiLine". то замініть його на android: minLines / android: maxLines.

Налаштовуємо зовнішній вигляд ListView

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

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

Android listview

Якщо вас не влаштовує стандартний роздільник, що можете намалювати якусь хвилясту лінію, зберегти її в PNG-файлі і використовувати як drawable-ресурс. Проробіть це самостійно.

Можна працювати з даними атрибутами програмно:

Якщо хочете прибрати роздільники, то використовуйте прозорий колір.

Помітив, що порядок виклику двох методів важливий, якщо установку висоти викликати перед установкою кольору роздільник, то метод затирає колір і результат буде такий же, як з прозорим кольором.

Зверніть увагу, що за замовчуванням роздільник не виводиться перед першим і останнім елементом списку. Якщо ви хочете змінити ці настройки, то використовуйте властивості Footer dividers enabled (атрибут footerDividersEnabled) і Header dividers enabled (атрибут headerDividersEnabled):

Призначений для користувача селектор

Ми вже бачили, що за замовчуванням обраний елемент списку виділяється за допомогою кольорової смужки. Даний селектор також можна налаштувати через атрибут android: listSelector. Створіть якусь текстуру для селектора і прив'яжіть його через ресурс. Ось зразок текстурованого ореолу жовтого кольору для селектора.

Android listview

Потрібно підготувати спочатку файл res / drawable / selector.xml:

Якщо вам потрібно відразу підсвітити потрібний елемент списку при запуску програми, то використовуйте зв'язку двох методів:

множинний вибір

ListView дозволяє вибирати не тільки один пункт, а й кілька. В цьому випадку потрібно встановити властивість Choice Mode в значення multiplyChoice. що відповідає атрибуту android: choiceMode = "multipleChoice".

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

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

Android listview

Залишилося тільки програмно отримати відмічені користувачем елементи списку. Ось мій список продуктів, який я хочу запропонувати коту. Сподіваюся, йому сподобається мій вибір. Вибрані елементи будемо поміщати в TextView:

Android listview

Якщо потрібно отримати окремо список обраних і невибраних елементів списку, то можна написати наступне:

Мінлива checked буде містити список обраних елементів, а змінна unchecked - список невибраних елементів.

Слід зазначити, що в прикладах використовувався старий метод getCheckedItemPositions (). доступний з Android 1. В Android 2.2 з'явився новий метод getCheckedItemIds (). Врахуйте, що з новим методом можна отримати масив тільки обраних елементів, хоча в більшості випадків цього достатньо. Але даний метод вимагає своїх проблем і в даному моєму прикладі він не заробив.

підсвічування натискань

На даний момент використовується наступна техніка підсвічування елементів списку при натисканні. Тут враховується версія Android (до і після API 21).

res / values ​​/ colors.xml

res / drawable / item_selector.xml

res / drawable-v21 / item_selector.xml

Різниця полягає в тому, що у версії 21 рекомендується використовувати сірий колір із застосуванням ripple.

Створені ресурси слід застосувати для фону елемента списку (list_item.xml): android: background = "@ drawable / item_selector".

Для перевірки встановимо режим singleChoice для активації вибраного елементу списку.

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

res / values-sw600dp / styles.xml

А в звичайному styles.xml залишимо заглушку.

Тепер застосуємо стиль до списку і потрібну поведінку з активацією буде застосовуватися тільки на планшетах.

При повороті обраний пункт списку може виявитися за межами екрану. За допомогою методу smoothScrollToPosition () ми можемо автоматично прокрутити список до потрібного місця. Код показаний в просунутих прийомах.

Кнопка під списком

Якщо ви хочете розмістити кнопку під списком, яка б не залежала від кількості елементів в ListView. то скористайтеся вагою (layout_weight).

Плавне прокручування в початок списку або будь-яку позицію

У списку є спеціальний метод smoothScrollToPosition (). дозволяє плавно прокрутити до потрібного місця. Досить в методі вказати номер позиції для прокрутки:

налаштовуємо прокрутку

У ListView є атрибути для настройки зовнішнього вигляду смуги прокрутки

Аналогічно це може бути застосовано до смуг прокрутки у ScrollView. EditText і т.д.

ListActivity

Якщо вам потрібна форма, що складається тільки зі списку, то вам простіше скористатися системним класом ListActivity замість стандартного Activity. Саме такий підхід описаний в документації по ListView. Приклад роботи описаний в статті ListActivity - створюємо прокручуваний список.

Налаштування кольору при досягненні краю прокрутки

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

Далі застосовуємо як тему.

Для більш старих пристроїв таку настройку зробити не можна.

додаткове читання