Android studio listview fragment

ListFragment. Основы

Самое распространённое использование фрагментов — списки и связанное с ним содержание. При использовании списков на планшете в альбомной ориентации справа оставалось слишком много пустого пространства. Фрагменты позволяют использовать данное пространство с пользой.

Представим себе ситуацию — у нас есть список ListView, содержащий ссылки. При щелчке на одной из ссылок мы открываем вторую активность, состоящую из какого-нибудь компонента: TextView или WebView. По сути, один экран у нас сменяется другим. Можно реализовать эту задачу по другому. На планшетах много места. Почему бы не расположить ListView и TextView на одном экране рядышком? И когда пользователь будет щёлкать слева на элементе списка, то в правой части будет обновляться содержимое TextView. Такой подход нам знаком, например, при чтении электронных писем — слева список писем, а справа — содержание выбранного письма.

Для связывания данных используются адаптеры ListAdapter, ArrayAdapter, SimpleAdapter, SimpleCursorAdapter и т.д. Подключение следует производить в методе onActivityCreated().

Стандартная разметка подгружается автоматически, для собственной разметки используйте метод onCreateView().

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

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

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

Как правило, ListFragment используют в паре с другим обычным фрагментом. А пока мы попробуем обойтись одним фрагментом. Создайте новый проект или используйте уже готовый проект и добавьте новый класс, который наследуется от ListFragment. Назовём новый класс SingleListFragment:

Как и с обычными фрагментами, списочный фрагмент может быть из библиотеки поддержки или из обычных классов Android.

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

Разместим фрагмент в разметке основной активности MainActivity. У нас это файл activity_main.xml:

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

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

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

Мы используем метод onActivityCreated(), так как именно здесь можно быть уверенным, что все необходимые компоненты фрагмента загрузились и фрагмент готов к использованию в составе активности. Метод onCreateView() в данном случае использовать не обязательно. В остальном код идентичен с кодом для ListActivity — массив, адаптер, связывание массива с адаптером.

Читайте также:  Тесты аккумуляторов андроид смартфонов

Запускаем проект и видим список с именами котов.

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

Если нужна своя разметка для списка, то поступаем точно также, как в уроке с ListActivity. Создаём в папке res/layout новый файл, скажем listfragment.xml и размещаем нужные элементы:

В шаблоне нужно разместить ListView с обязательным идентификатором @id/android:list. Компонент TextView будет показан в том случае, если нет данных для списка. Он также должен иметь обязательный идентификатор @id/android:empty. Помните, в начале статьи я приводил исходник системного фрагмента?

Разметка подключается в методе onCreateView():

Запустив проект, мы увидим список с зелёным фоном. Если отключить адаптер, то можно увидеть уже свой компонент TextView со своим текстом, который вы определили в ресурсе @string/empty.

Если в ListView вы добавите атрибут android:choiceMode=»singleChoice» для одиночного выбора, то в адаптере рекомендую использовать другой ресурс android.R.layout.simple_list_item_activated_1. В этом случае выбранный элемента списка будет иметь другой цвет, что позволит быстро определять выделенный элемент.

Нажатия на элементах списка

Определять нажатия на отдельных элементах списка можно через метод фрагмента onListItemClick():

Если вас интересует текст выбранного элемента:

Если вы хотите настраивать внешний вид каждого элемента, например, разместить значок, то опять ничего нового здесь нет. Нужно создать свою разметку для элемента списка и написать свой адаптер. Простой пример. Создадим новую разметку res/layout/listfragment_row.xml:

В классе фрагмента прописываем свой адаптер. В методе onActivityCreated() присоединяем свой адаптер, а в методе onListItemClick() меняем код.

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

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

listfragment.xml

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

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

Источник

Полный список

— работаем с ListFragment

Вернемся к фрагментам. В Android есть несколько полезных классов – наследников класса Fragment. Мы рассмотрим несколько из них. Начнем с ListFragment. В принципе, это просто Fragment, в котором есть методы, упрощающие доступ к ListView и некоторым его операциям.

Тут можно провести аналогию — для Activity есть класс наследник ListActivity. Когда мы только знакомились со списками, я не стал рассматривать этот класс, чтобы не вносить путаницы в непростую тему. Но в учебниках и хелпе о нем обычно говорят. Думаю, многие уже сталкивались с ним и примерно знают, что это такое. Если да, то ListFragment будет совсем прост для понимания.

Напишем приложение и рассмотрим основные возможности ListFragment.

Project name: P1091_ListFragment
Build Target: Android 4.1
Application name: ListFragment
Package name: ru.startandroid.develop.p1091listfragment
Create Activity: MainActivity

Создадим класс фрагмента, наследующий не android.app.Fragment как обычно, а android.app.ListFragment.

Класс так и оставляем пока пустым. И пока что не будем создавать Layout-файл для этого фрагмента. Дело в том, что ListFragment по умолчанию уже содержит ListView и мы вполне можем обойтись им. Адаптер мы пока также никакой не создаем, посмотрим чего получится.

Редактируем layout для MainActivity

Здесь только компонент fragment, использующий наш класс.

Все сохраняем, запускаем приложение.

ListFragment показывает нам, что он ждет данных.

Ок, давайте дадим ему данные. Перепишем MainList.java:

Мы создаем адаптер и используем метод setListAdapter, чтобы передать его списку. Обратите внимание — мы даже не создаем или не находим (findViewById) список (ListView), он уже есть где-то внутри фрагмента и метод setListAdapter сам знает, как до него добраться. В принципе, это и есть основная фишка ListFragment — нам не надо работать с ListView.

Читайте также:  Темы значков для андроида

Все сохраним, запустим приложение.

Еще раз обращаю ваше внимание на то, что мы вообще не создавали никаких layout с ListView. ListFragment работает с каким-то своим, встроенным списком.

Если же вас чем-то не устраивает этот дефолтный список, можно использовать свой layout-файл для фрагмента.

В strings.xml добавим строки

И создадим layout файл fragment.xml:

Первый TextView – просто заголовок списка. Далее идет ListView. Его ID обязательно должен быть равен @id/android:list. Чтобы ListFragment сам его нашел и мог с ним работать. Второй TextView – будет показан, если нет данных для списка. Его ID обязательно должен быть равен @id/android:empty.

Допишем в MainList.java метод создания View.

Фрагмент будет отображать компоненты из layout-файла, который мы только что создавали.

Все сохраняем и запускаем.

Видим заголовок и данные. Наш layout был использован.

Если не дать списку данные, то приложение будет выглядеть так

Отобразился наш второй TextView с Причем, это вовсе не обязательно должен быть TextView. Главное тут именно этот ID. Компонент с этим ID будет показан вместо ListView, если нет данных.

Чтобы включать одиночный и множественный выбор, необходимо провести все те же действия, которые мы рассматривали в Уроке 43: передать в адаптер соответствующий layout-файл и включить соответствующий режим выбора для списка. В этом же 43-м Уроке можно посмотреть, как определять, какие пункты списка выбраны. Чтобы в ListFragment получить доступ к списку – используйте метод getListView.

Результаты включения режима выбора будут такие:

Еще, как вариант, можно в адаптер передавать layout-файл android.R.layout.simple_list_item_activated_1.

В этом случае результаты будут такие:

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

Чуть не забыл про самое главное ) Ловить нажатия можно в методе onListItemClick. Он очень похож на метод onItemClick из Урока 44.

Если добавим в MainList.java его реализацию:

то при нажатии на пункт списка, увидим результат:

На следующем уроке:

— работаем с DialogFragment

Присоединяйтесь к нам в Telegram:

— в канале StartAndroid публикуются ссылки на новые статьи с сайта startandroid.ru и интересные материалы с хабра, medium.com и т.п.

— в чатах решаем возникающие вопросы и проблемы по различным темам: Android, Kotlin, RxJava, Dagger, Тестирование

— ну и если просто хочется поговорить с коллегами по разработке, то есть чат Флудильня

— новый чат Performance для обсуждения проблем производительности и для ваших пожеланий по содержанию курса по этой теме

Источник

Создать listview в фрагменте android

в качестве заголовка я хочу создать listview с пользовательской строкой во фрагменте. Мой код ниже.

но когда я запускаю приложение, которое ничего не отображает. Может кто-нибудь сказать мне, что здесь неправильно и как я могу это исправить?

5 ответов

Я думаю, ваше приложение падает из-за NullPointerException .

предполагая, что listview принадлежит макету фрагмента.

остальная часть кода выглядит хорошо

ну, так как вы сказали, что это не работает, я попробовал сам

Читайте также:  Аудиоплеер с возможностью изменения скорости воспроизведения для андроид

пожалуйста, используйте ListFragment . Иначе ничего не получится.

EDIT 1: Тогда вам понадобится только setListAdapter() и getListView() .

метод inflate () принимает три параметра:

    идентификатор XML-файла макета (внутри R. layout),

родительская ViewGroup, в которую должен быть вставлен вид фрагмента,

третий логический говорю ли просмотр фрагмента как надувается от XML-файл макета должен быть вставлен в родительскую группу представлений.

в этом случае мы передаем false, потому что представление будет прикреплено к родительская ViewGroup в другом месте, по некоторым из Android кода мы вызываем (в другими словами, за нашими спинами). При передаче false в качестве последнего параметра чтобы надуть (), родительская ViewGroup по-прежнему используется для макета вычисления завышенного представления, поэтому вы не можете передать null как родительский ViewGroup .

Источник

Используем стандартные элементы ListFragment по назначению

В одном из проектов столкнулся с тем, что в приложении нужно было отображать списки результатов для различных запросов (поиск по словам, датам, тегам и т.п.). Так как списки повторялись в разных Activity, самым очевидным решением было использовать фрагменты, а конкретно создать свой класс ListFragment и повторно использовать его в проекте.

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

Прежде, чем начать работать с ListFragment, давайте немного изучим, что же находится внутри?

По умолчанию используется разметка из

\sdk\platforms\android-XX\data\res\layout\list-content.xml
У некоторых представлений этой разметки имеются идентификаторы, благодаря которым мы можем кастомизировать родительский контейнер, список и текст пустого списка.

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

Итак, создадим наш класс:

И включим его в разметку нашего Activity (либо можно установить фрагмент программно)

Запускаем приложение, переходим к нашему Activity и сразу же видим анимацию загрузки:

Теперь, для того, чтобы скрыть анимацию и отобразить список, нам достаточно установить адаптер вызвав метод setAdapter(ListAdapter adapter). В этом проекте я использовал Loader в Activity и OttoBus событие, но вариантов передать объект списка во фрагмент предостаточно, поэтому прошу не обращать внимание на сам метод.

Сразу после установки адаптера анимация исчезнет и мы увидим:

А если наш список вдруг окажется пустым, то получим другой экран:

Для установки своего empty-текста используется метод:

Также в классе ListFragment имеется метод обработки нажатий списка, который мы можем переопределить

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

Итого. ListFragment имеет свои представления и логику работы.
Надеюсь эта статья позволит вам принять оценить, достаточно ли вам встроенной реализации или же нужно писать свою.
P.S. Лично мне понравилась простота и скорость внедрения в проект, где я смог успешно использовать один класс фрагмента сразу в 4х различных Activity.

Плюсы:
* Не обязательно создавать XML-разметку.
* Нет необходимости объявлять представления в вашем классе.
* Не нужно реализовывать логику показа/скрытия анимации, списка и empty-текста.
* Не нужна установка «слушателя»
* Меньше кода.

Минусы:
* Нужно изучить методы класса ListFragment и как все работает.
* Нельзя изменить встроенную анимацию даже через собственную разметку.
* Нельзя переопределить логику скрытия/показа анимации, списка и empty-текста.

Источник

Оцените статью