Android: Знайомтеся - ListView
Знаходиться в папці Composite.
ListView складніший в застосуванні в порівнянні з TextView і іншим простими елементами. Робота зі списком складається з двох частин. Спочатку ми додаємо на форму сам ListView, а потім заповнюємо його елементами списку.
Розглянемо для початку найпростіший приклад. Помістіть на форму віджет ListView. Ви побачите, що список буде містити кілька елементів Item і Sub Item.
Однак, якщо подивимося 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.
відступ
Якщо ви будете брати рядки з ресурсів, то код буде таким:
А буде ще краще, якщо ви скористаєтеся спеціально призначеним для цього випадку типом ресурсу
Запустивши проект в емуляторі, ви побачите працюючий приклад прокручуваного списку. Правда, створений список поки не реагує на натискання. Але при натисненні вибраний елемент виділяється кольоровим прямокутником (у версії Android 2.3 був помаранчевий, а в Android 4.0 - синій).
власна розмітка
У прикладі ми використовуємо готову системну розмітку android.R.layout.simple_list_item_1. в якій налаштовані кольори, фон, висота пунктів та інші параметри. Але немає ніяких перешкод самому створити власну розмітку під свій додаток.
Ми бачимо, що в якості розмітки використовується TextView з набором атрибутів.
Створимо свій шаблон для окремого пункту списку. Для цього в папці res / layout / створимо новий файл list_item.xml:
Ви можете налаштовувати всі атрибути у TextView, крім властивості Text. так як текст буде автоматично заповнюватися елементом ListView програмним шляхом. Ну, а далі просто міняєте в коді системну розмітку на свою:
Динамічне заповнення списку
Розглянемо приклад динамічного заповнення списку, коли список спочатку порожній і користувач сам додає нові елементи. Розмістимо на екрані текстове поле, в якому користувач буде вводити відомі йому імена котів. Коли користувач буде натискати на клавішу Enter на клавіатурі, то введене ім'я кота буде потрапляти в список.
У нас вийшов каркас для чату, коли користувач вводить текст і він потрапляє в список. Далі треба отримати текст від іншого користувача і також додати в список. До слова сказати, слово chat з французької означає "кішка". Але це вже зовсім інша історія.
Прослуховування подій елемента ListView
Нам потрібно реагувати на певні події, які генеруються елементом ListView, зокрема, нас цікавить подія, яке виникає, коли користувач натискає на один з пунктів списку.
У цьому нам допоможе метод setOnItemClickListener елемента ListView і метод OnItemClick () класу AdapterView.OnItemClickListener.
Тепер при натисканні на будь-який елемент списку ми отримаємо спливаюче повідомлення, що містить текст вибраного пункту.
Природно, ми можемо не тільки виводити повідомлення, але і запускати нові активності і т.п.
У метод onItemClick () передається вся необхідна інформація, необхідна для визначення натиснутого пункту в списку. У наведеному вище прикладі використовувався простий спосіб - наводимо обраний елемент об'єкта TextView, так як відомо, що всі пункти є елементами TextView (Для додаткової перевірки можете використовувати оператор instanceOf). Ми витягуємо текст з обраного пункту і порівнюємо його з своїм рядком.
Також можна перевіряти атрибут id для визначення натискання пункту списку.
ListView не реагує на натискання
У деяких випадках натискання на пунктах меню не спрацьовують. Нижче наводяться кілька можливих причин.
Приклад містить CheckBox, який також має свій слухач натискань. Спробуйте видалити фокус у нього:
Спробуйте перемістити OnItemClickListener перед установкою Adapter. Іноді допомагає :-)
Приклад містить ImageButton. Помістіть об'єкт у фокус в false:
Приклад містить TextView. Якщо ви використовуєте атрибут android: inputType = "textMultiLine". то замініть його на android: minLines / android: maxLines.
Налаштовуємо зовнішній вигляд ListView
У ListView є кілька корисних атрибутів, що дозволяють зробити список більш привабливим. Наприклад, у нього є атрибут divider. який відповідає за зовнішній вигляд роздільник, а також атрибут dividerHeight. відповідальний за висоту роздільник. Ми можемо встановити який-небудь колір або навіть картинку для роздільник. Наприклад, створимо для роздільник колірної ресурс з червоним кольором, а також ресурс розміру для його висоти:
Далі дамо створений ресурс атрибуту divider. а також поставимо його висоту в атрибуті dividerHeight у нашого елементу ListView:
Якщо вас не влаштовує стандартний роздільник, що можете намалювати якусь хвилясту лінію, зберегти її в PNG-файлі і використовувати як drawable-ресурс. Проробіть це самостійно.
Можна працювати з даними атрибутами програмно:
Зверніть увагу, що за замовчуванням роздільник не виводиться перед першим і останнім елементом списку. Якщо ви хочете змінити ці настройки, то використовуйте властивості Footer dividers enabled (атрибут footerDividersEnabled) і Header dividers enabled (атрибут headerDividersEnabled):
Призначений для користувача селектор
Ми вже бачили, що за замовчуванням обраний елемент списку виділяється за допомогою кольорової смужки. Даний селектор також можна налаштувати через атрибут listSelector. Створіть якусь текстуру для селектора і прив'яжіть його через ресурс. Ось зразок текстурованого ореолу жовтого кольору для селектора, взятого з книги Android за 24 години. Програмування додатків під операційну систему Google.
Якщо вам потрібно відразу підсвітити потрібний елемент списку при запуску програми, то використовуйте зв'язку двох методів:
множинний вибір
ListView дозволяє вибирати не тільки один пункт, а й кілька. В цьому випадку потрібно встановити властивість Choice Mode в значення multiplyChoice. що відповідає атрибуту android: choiceMode = "multipleChoice".
Також множинний вибір можна встановити програмно за допомогою методу setChoiceMode (ListView.CHOICE_MODE_MULTIPLE).
Тепер, якщо створити масив рядків, наприклад список продуктів для котячого сніданку, то отримаємо наступний результат.
Залишилося тільки програмно отримати відмічені користувачем елементи списку. Ось мій список продуктів, який я хочу запропонувати коту. Сподіваюся, йому сподобається мій вибір. Вибрані елементи будемо поміщати в TextView:
Якщо потрібно отримати окремо список обраних і невибраних елементів списку, то можна написати наступне:
Мінлива checked буде містити список обраних елементів, а змінна unchecked - список невибраних елементів.
Слід зазначити, що в прикладах використовувався старий метод getCheckedItemPositions (). доступний з Android 1. В Android 2.2 з'явився новий метод getCheckedItemIds (). Врахуйте, що з новим методом можна отримати масив тільки обраних елементів, хоча в більшості випадків цього достатньо. Але даний метод вимагає своїх проблем і в даному моєму прикладі він не заробив.
Кнопка під списком
Якщо ви хочете розмістити кнопку під списком, яка б не залежала від кількості елементів в ListView, то скористайтеся вагою (layout_weight).
Плавне прокручування в початок списку або будь-яку позицію
У списку є спеціальний метод smoothScrollToPosition (). дозволяє плавно прокрутити до потрібного місця. Досить в методі вказати номер позиції для прокрутки:
налаштовуємо прокрутку
У ListView є атрибути для настройки зовнішнього вигляду прокрутки
ListActivity
Якщо вам потрібна форма, що складається тільки зі списку, то вам простіше скористатися системним класом ListActivity замість стандартного Activity. Саме такий підхід описаний в документації по ListView. Приклад роботи описаний в статті ListActivity - створюємо прокручуваний список.