Тёмный

Jetpack Paging 3. Пагинация на Android 

Android Broadcast. Все об Андроид разработке
Просмотров 37 тыс.
50% 1

Организация пагинации длинных списков в Android приложениях на основе Jetpack Paging 3.0
🔗 AvitoTech avito.tech/
🔗 Каналы "Android Broadcast" taplink.cc/android_broadcast
🔗 Поддержать проект taplink.cc/android_broadcast/...
🔗 Подать заявку на выступление в Android Broadcast forms.gle/rrfXjYBD1i3XYmJx9
🔗 Руководство Jetpack Paging 3.0 bit.ly/30JJewb
🔗 Android Paging Codelab от Google bit.ly/3f49Uxa
🔗 Код из видео bit.ly/33zdbiG
0:00 Вступление
0:33 Зачем нужна пагинация?
3:30 Партнерская интеграция
4:00 Jetpack Paging 3
5:55 Архитектура пагинации от Google
8:40 Конфигурация Paging 3
12:13 Реализация PagingSource
22:09 Интеграция PagingSource в ViewModel
25:13 Отображение данных
27:47 Отображение ошибок/прогресса в header/footer
30:09 Отслеживание состояния загрузки
32:48 Проблемы RemoteMediator
34:22 Заключение
34:48 Титры
#AndroidBroadcast #Paging #Jetpack

Наука

Опубликовано:

 

22 июл 2024

Поделиться:

Ссылка:

Скачать:

Готовим ссылку...

Добавить в:

Мой плейлист
Посмотреть позже
Комментарии : 119   
@AndroidBroadcast
@AndroidBroadcast 3 года назад
🔗 AvitoTech avito.tech/ 💰 Поддержать проект bit.ly/3sratqQ 📰 Android Broadcast Telegram ttttt.me/android_broadcast
@user-ft9cl8dm6y
@user-ft9cl8dm6y 3 года назад
Ъ
@beeline09
@beeline09 3 года назад
Все никак руки не доходили изучить тему, но благодаря тебе все легко усвоил. Спасибо за хороший контент!
@05Sambist
@05Sambist 3 года назад
спасибо большое Кирилл!! как раз изучаю данную тему!!
@user-jo4pu2tg3w
@user-jo4pu2tg3w 3 года назад
Спасибо большое! Побольше бы таких обучающих видео
@avramones8960
@avramones8960 2 года назад
Спасибо за видео, Кирилл. Очень познавательно.
@Capitistrum
@Capitistrum 4 месяца назад
Спасибо за видео! Официальная документация не особо хотела поддаваться мне. А когда видео и с исходным кодом - удалось разобраться! :)
@lemarkmain1713
@lemarkmain1713 2 года назад
Спасибо! все запустилось и, казалось бы, такие сложные вещи уже стали более понятными :) а статью по paging 3 с дев андроид сайта все же было сложнее разобрать
@EpicRackBattle
@EpicRackBattle 3 года назад
Огромное спасибо за твой труд Кирилл, лайк за тему не глядя !!!
@AndroidBroadcast
@AndroidBroadcast 3 года назад
А лучше ещё и посмотреть до конца и обратной связи побольше!
@user-ou9ft3yw3h
@user-ou9ft3yw3h 3 года назад
Благодарю, очень интересно
@amandoponov3560
@amandoponov3560 3 года назад
Спасибо, успехов каналу👍🏼
@user-nf9gh5kv5c
@user-nf9gh5kv5c 3 года назад
Отличное видео. Спасибо!
@heroachilles
@heroachilles 3 года назад
Благодарю, очень интересно!
@nowiwr01
@nowiwr01 3 года назад
Спасибо за видео, Кирилл. Вы очень хорошо объясняете)
@AndroidBroadcast
@AndroidBroadcast 3 года назад
Рад стараться!
@sergeyvoloshin1553
@sergeyvoloshin1553 3 года назад
комментарий в поддержку канала, спс за контент!
@user-jl7kw8hx6i
@user-jl7kw8hx6i 2 года назад
Кирилл, большое спасибо за крутой контент! !!
@Oleg_Bessonov
@Oleg_Bessonov 3 года назад
Спасибо!!!
@MikhailGureev
@MikhailGureev 2 года назад
Топовый видос! Ракета-пушка-гонка! Спасибо!
@grafd2505
@grafd2505 3 года назад
Пробовал эту библиотеку на пет проекте. У этой библиотеки есть один существенный минус - не гибкое апи. Узнать, находится ли список в состоянии прогресса, можно только подписавшись на колбэки ресайклера. То есть вместо того, чтобы стейт был единым и содержался во вью модели, он получается размазанным и зачем-то привязанным к вьюхе. Это значит, что если вы захотите изменить вашу вью, например, воспользоваться джетпак компоузом вместо фрагментов, то придется существенно менять код во вью модели в том числе. Для продакшена я бы не рекомендовал использовать эту библиотеку.
@devkot7040
@devkot7040 2 года назад
Можете подсказать, есть ли какая-то альтернатива данной библиотеке? И есть ли в данной альтернативе возможность кэширования?
@Footba246
@Footba246 2 года назад
Спасибо за видео, Кирилл
@liammcdara1104
@liammcdara1104 2 года назад
Круто. Большое спасибо. Еще сделайте пожалуйста видео про использование RemoteMediator и как работать с базой при этом. Может на данный момент уже появились обновления.
@alexkreyter432
@alexkreyter432 2 года назад
Класс! Насчет разделения моделей, вроде как можно смапить на выходе медиатора под ui модель
@SuperMarkwel
@SuperMarkwel 3 года назад
Божественный контент, спасибо! Кирилл, думал ли ты о том, что бы сделать серию видео роликов, где бы ты создал простое приложение на максимально современном стеке?
@AndroidBroadcast
@AndroidBroadcast 3 года назад
У меня была идея таким заняться. Думал заняться такой разработкой, но вот как красиво это вписать в короткий формат я не знаю, да и смотреть как я кожу 6-8 часов подряд и также рыщу доки может быть мало кому интересно. Если есть предложения я рад обсудить, а еще можно поговорить об этом в ближайшем баре
@nickzhylach4379
@nickzhylach4379 3 года назад
@@AndroidBroadcast Я понимаю, что это работа, но может попробовать? В конце концов всякие стримы игр смотрят)) а тут в любом случае было бы полезно. Думаю даже не только в плане использования всяких либ из стека, но и код-стайл, и организация архитектуры. Одно дело когда смотришь репозиторий и пытаешься разобраться и всё связать, а другое, когда смотришь весь этот техпроцесс от начала и до конца. Может быть, даже сделать "сериал".
@awkwardquestion8643
@awkwardquestion8643 3 года назад
@@AndroidBroadcast обычно такие лайв-штуки не то что бы прямо людям заходят, но мне кажется, если включить в процесс второго человека (что-то типо парного программирования), то сам формат получится гораздо живее (обсуждение решений друг друга, поиск лучших и мини холивары апрувед). Правда это надо еще такого второго человека + чтобы он мог с тобой на равных кодить. Я по крайней мере такого не видел.
@maksmokrytskyi2556
@maksmokrytskyi2556 3 года назад
Это уже почти онлайн курс получается :) Но однозначно было бы полезно многим
@user-dy6ul7wi4q
@user-dy6ul7wi4q 2 года назад
Спасибо!
@TheNikbrik
@TheNikbrik 3 года назад
Спасибо, полезно!
@AndroidBroadcast
@AndroidBroadcast 3 года назад
💪
@user-te8um6ox9p
@user-te8um6ox9p 3 года назад
Круто! Спасибо большое! Шрифт в студии чуть побольше бы
@AndroidBroadcast
@AndroidBroadcast 3 года назад
В следующий раз сделаю все как надо
@anvarjuraqulov7165
@anvarjuraqulov7165 2 года назад
Спасибо брат отличное видео
@rikimaru2015
@rikimaru2015 3 года назад
Спасибо за информацию. Как раз смотрю paging 3 для перехода с paging 2 - много чего из коробки поддерживается, но все же некоторые проблемы такие же как и в прошлой версии. Например, если мы хотим после refresh показать начало списка, то также нужно изощрятся. Также смотрю если мы проскролим куда-то на несколько страниц вниз и потом добавляем в начало списка новый элемент, то он не появляется и onItemRangeInserted не срабатывает. Кирилл, если будет возможность сделайте потом более подробный разбор с добавлением, удалением элементов - все обзоры и примеры обычно делают только с отображением списка
@AndroidBroadcast
@AndroidBroadcast 3 года назад
Подробнее про что именно в добавление/удалении элементов? Это примеры касается Paging или RecyclerView именно?
@rikimaru2015
@rikimaru2015 3 года назад
@@AndroidBroadcast Ну было бы отлично рассмотреть как реализовать в paging 3 ленту своих постов. Мы их может загрузить с api, закешировать (для отображения без интернета). Также можем добавить новый пост или удалить существующий. Я так понимаю в новом paging для этого мы будем использовать RemoteMediator. При чем тут paging - в версии 2 удаление элемента можно было нормально сделать только через room. Если мы использовали без рум, то там вариант для обновления списка только invalidate - что не очень красиво выглядит.
@danemano8677
@danemano8677 3 года назад
Поддерживаю запрос, при реализации чата возникла проблема с приходом нового сообщения, когда пользователь проскролил чат наверх, не понятно как это сделать не перезагружая все данные заново
@alexkreyter432
@alexkreyter432 2 года назад
Брал эту же newsapi попробовать сделать mediator, столкнулся с проблемой, не получается нормально пагинировать данные, сначала спокойно проходит первая страница, потом залпом 3, и под конец еще одна. Наверное, я дурак, или какая-то магия с LoadType
@user-zw5ps7jz2y
@user-zw5ps7jz2y 2 года назад
При повороте экрана приложение падает с ошибкой "Attempt to collect twice from pageEventFlow, which is an illegal operation. Did you forget to call Flow.cachedIn(coroutineScope)?...". Пробовал по по гугловскому мануалу сделать через с помощью Rx. Оно вроде бы работает, но при повороте экрана список загружается снова. В чем дело не понятно(
@kovanodevelop
@kovanodevelop 2 года назад
Подскажите пожалуйста: как подсветить разным цветом фигурные скобки в студии?
@AndroidBroadcast
@AndroidBroadcast 2 года назад
Плагин Rainbow Brackets в IDEA/Android Studio
@kirillsushilnikov9614
@kirillsushilnikov9614 4 месяца назад
Спасибо, Кирилл. А как можно модифицировать данные в адаптере извне? Скажем, прилетела инфа, что такой-то айтес с определенным id должен быть обновлен (например произошло добавление в избранное). Если делать через submitData, то обновляется полностью список и пашигация ломается.
@AndroidBroadcast
@AndroidBroadcast 4 месяца назад
Можно поменять данные через DiffUtil списками, либо в списке данных внести изменения и вызвать у адаптера метода что изменился конкретный элемент
@farizmamedow2329
@farizmamedow2329 3 года назад
Круто. Практическую часть отдельное спасибо. И можно в след раз увеличить как то шрифт а то плохо видно
@AndroidBroadcast
@AndroidBroadcast 3 года назад
Да, в следующий раз сделаю немного по другому
@user-sankarsana
@user-sankarsana 3 года назад
Да, а то даже на 17 дюймах мелковато.
@jay_msk
@jay_msk 2 года назад
Кирилл привет! А как решается проблема дубликатов? Если к пример была загружена первая страница, потом на бэке был добавлен новый элемент в топ. При загрузки следующей страницы у нас будет дубликат в виду того что на бэке все съехало на 1 позицию
@AndroidBroadcast
@AndroidBroadcast 2 года назад
Это ответственность сервера. Он либо должен иметь ключи,тобой должен уведомлять вас об необходимости загрузки с нуля
@borisveriga5252
@borisveriga5252 3 года назад
Кирилл привет! Спасибо за видео! Есть идея для ролика: мог бы ты рассказать лучшие про практики создания библиотек для Андройда? Доставка, публичные методы, внутренняя логика(может есть своя особенность тут) подводные камни и т.д. ✌
@AndroidBroadcast
@AndroidBroadcast 3 года назад
Подумаю, может и соберётся видео
@alyxeinside3930
@alyxeinside3930 3 года назад
Привет Спасибо за видео Есть ещё один интересный момент, что если RemoteMediator вернул endOfPaginationReached true и, а мы вдруг резко придумали делать фильтры через RM, то вполне ожидаемая ситуации, что данные уже не будут грузиться. Очень хотелось бы, чтобы в следующей версии они сделали фабрику для RM, как для PagingSource. Иначе не получится использовать локальное хранилище, а это прям грусть-грусть.
@ivanchepelkin6347
@ivanchepelkin6347 2 года назад
Можно ли в запросе передавать не только ключ и страницу, но еще и какие то свои кастомные параметры (query, path, body) ? Как это делать? метод load принимает только 2 параметра(
@AndroidBroadcast
@AndroidBroadcast 2 года назад
Это все передается через конструктор, так как Paging работает для одного и того же вызова API с пагинацией
@sleepycreepy6424
@sleepycreepy6424 3 года назад
спасибо за видео, я правильно понимаю, что пагинация юзается в том случае, когда сервер может информацию постранично? если сервер выдает инфу сплошняком, без возможности задания конкретной страницы, то и пагинация не нужна?
@AndroidBroadcast
@AndroidBroadcast 3 года назад
Вы верно сказали, только сервер не должен выдавать много данных сразу: - слишком долго будут проходить сетевые запросы - клиенту придется обрабатывать данные, которые не факт что ему нужны - может произойти OutOfMemoryError
@sleepycreepy6424
@sleepycreepy6424 3 года назад
@@AndroidBroadcast понятно, спасибо большое)
@danman2097
@danman2097 Месяц назад
Здравствуйте, если написать реализацию, как у вас, то при перевороте экрана будет снова выводиться snackbar, так как снова будет прилетать state ошибки. можно ли как-то получить ошибку во viewmodel? в целом, как это можно исправить?
@AndroidBroadcast
@AndroidBroadcast Месяц назад
SingleLiveEvent или SharedFlow на замену можно. Ещё вариант - держать ошибку часть часть модели состояния для UI. Также можно просто отправлять событие об ошибке
@bty_s
@bty_s 3 года назад
В моем случае часть параметров REST запроса может изменяться в UI. В примерах с RemoteMediator что в сэмплах гугла, что в кодлабс, что в доках нет примера такого юзкейса. Передав в Pager remoteMediator с query в конструкторе, изменить query уже не выйдет, тк до remoteMediator после создания pager уже не добраться. Как менять уже существующий query из UI внутри remoteMediator на ходу я что-то не придумал (если такой способ вообще есть). Выходом оказалось реинициализация самого Pager при изменении параметров query. Но с этим вариантом тоже нашлась проблема. В некоторых вариках построения пайплайна флоу, при смене query, новый вызов Pager(..).flow возвращал всегда один и тот же старый инстанс. Долго разбираться с этим не стал, причины наверняка где-то зашиты в сорсах. В конце концов сумел заставить его мне каждый раз новый флоу возвращать. Но было бы конечно здорово иметь такую возможность из коробки.
@alyxeinside3930
@alyxeinside3930 3 года назад
Привет Вижу не один столкнулся с этой проблемой Так получилось настроить кеширование или все таки данные грузятся через PagingSource?
@AndroidBroadcast
@AndroidBroadcast 3 года назад
Через RemoteMediator можно настроить кеширование только при условии одинаковых моделей
@GarcianSmt
@GarcianSmt 3 года назад
Спасибо за видео! Сам уже в нескольких проектах использовал Paging 3 (медиатор для кеширования никогда не использовал). Для меня остался актуальным вопрос, каким образом это можно протестировать (я имею ввиду unit-тесты). Сам ковырялся, но к чему-то однозначному и полезному не пришел.
@AndroidBroadcast
@AndroidBroadcast 3 года назад
Там есть специальная зависимость для работы с Paging 3 из Unit тестов, но вот что там я не смотрел
@bekaryssailaukul1006
@bekaryssailaukul1006 2 года назад
Как сделать такие же зависимости в koin ?
@gaoliang1368
@gaoliang1368 Год назад
It would be awesome if you can make a CRUD operations with Paging 3
@l1xly317
@l1xly317 2 года назад
Кирилл, а проблема с RemoteMediator, о которой ты упоминал в конце, уже решена в библиотеке?
@AndroidBroadcast
@AndroidBroadcast 2 года назад
Насколько знаю в 3.1 пока все было по старому
@l1xly317
@l1xly317 2 года назад
@@AndroidBroadcast эхх жаль, спасибо за ответ
@nazirjonm6560
@nazirjonm6560 2 года назад
Спасибо за видео! Как можно item добавить, изменить, удалить в PagingDataAdapter?
@AndroidBroadcast
@AndroidBroadcast 2 года назад
Не знаю ( Скорее всего надо удалять его в модели
@user-nv6rk5wt3f
@user-nv6rk5wt3f 3 года назад
Либа получилась прикольная, есть только один вопрос, можно ли сделать показ первого прогресс без привязки в adapter?
@AndroidBroadcast
@AndroidBroadcast 3 года назад
Можно попробовать подписаться на Flow из Pager. Он будет пустой или содержать какой-то стаб
@AndroidBroadcast
@AndroidBroadcast 3 года назад
Каким-то образом PagingDataAdapter получает информацию из PagingData, точно способ есть. Возможно API internal
@alyxeinside3930
@alyxeinside3930 3 года назад
Привет Спасибо за видео Над paging'ом прям какие-то гении работали, весь интересно все придумали. По поводу, момента с типами данных и почему они, что у PagingSource, что у RemoteMediator одинаковые - весьма интересно. Что один, что второй - это один и тот же уровень абстракции, и оба обращаются к репозиторию для получения данных. Только один передает набор в PagingAdapter, а другой запрашивает и сообщает, что источник истощен. Ни один из них не должен знать откуда данные получаются, ни куда они сохраняются. Соответственно, оба используют следующий уровень абстракции. Таким образом, у нас получается, что есть view - viewModel - paging - repository - api. Казалось бы чутка грамосткая цепочка, но PagingData может мапиться внутри viewModel, а потом ещё и в view. Google похоже задумала выносить paging в multiplatform.
@AndroidBroadcast
@AndroidBroadcast 3 года назад
По поводу KMM - тут не спроста уже завезена поддержка Compose и есть артефакт без Android зависимостей
@amaralez5718
@amaralez5718 2 года назад
В чем разница между возвратом из интерфейса запроса Response и Call?
@AndroidBroadcast
@AndroidBroadcast 2 года назад
Response это результат в обёртка, а Call - это сущность вызова из OkHttp
@user-xv4je5gs4h
@user-xv4je5gs4h 2 года назад
В PagingConfig указываю pageSize = 5. Но по факту (при первой инициализации) получаю params.loadSize - 15! Почему так?
@AndroidBroadcast
@AndroidBroadcast 2 года назад
Первая загрузка немного другая. Там есть доп параметры, влияющие на количество элементов при первой загрузке, чтобы сразу скролл не возникал.
@user-ot1mo1rj8d
@user-ot1mo1rj8d 2 года назад
9:45 просто взгляни
@alexandernifanin7366
@alexandernifanin7366 3 года назад
Код примера написан хорошо, библиотека сложная (проще велосипедом). Скачал пример, запустил на эмуляторе - отображается белый список без данных. Отключение соединения ничего не меняет (не выводятся ошибки). Даже смена URL ничего не меняет.
@AndroidBroadcast
@AndroidBroadcast 3 года назад
Возможно превышен лимит на количество запросов по API
@apbuzzz
@apbuzzz 3 года назад
Спасибо за обзор либы.
@Artem-nl5rw
@Artem-nl5rw 2 года назад
Спасибо большое за видео! И было бы хорошо увеличить шрифт или кадрировать запись только на редактор кода. С мобилки неудобно смотреть =)
@AndroidBroadcast
@AndroidBroadcast 2 года назад
В более поздних видео я уже улучшал этот параметр
@neerajverma9226
@neerajverma9226 3 года назад
Do you have any English channel?
@AndroidBroadcast
@AndroidBroadcast 3 года назад
No
@user-qf5nn8xn3o
@user-qf5nn8xn3o 2 года назад
Подскажите, есть ресурс на русском языке с более подробным обзором Paging?
@user-ky2bu1wl7n
@user-ky2bu1wl7n 3 года назад
Добрый день, а можно осветить в одном из следующих видео как в Jetpack Compose Desktop (не Android) прикрутить нормально MVVM (c usecase, repository, coroutines). Даже просто примитивный пример с каким-нибудь Api. А то все рисуют красивую , почти статичную верстку, а чтобы эта верстка зависела от нормальной бизнес логики - нет. Заранее спасибо
@AndroidBroadcast
@AndroidBroadcast 3 года назад
Тема Compose будет освещаться на канале, но вот Desktop не в приоритете
@tommyrio8081
@tommyrio8081 2 года назад
А как тестировать пагинацию на моб приложениях
@AndroidBroadcast
@AndroidBroadcast 2 года назад
Что именно протестировать хочется?
@5treetart863
@5treetart863 3 года назад
Пагинация назад вроде ж была в старой библиотеке
@AndroidBroadcast
@AndroidBroadcast 3 года назад
Возможно, я не помню уже
@YEVSU
@YEVSU 3 года назад
А может кто-то этот факт подтвердить на собственном опыте? У меня со старой версией пагинация назад не работала и я думал что метод loadBefore существует только для частных случаев, когда у пользователя етсь возможность прыгнуть по shortcut в середину списка.
@5treetart863
@5treetart863 3 года назад
@@YEVSU я лично использовал пагинацию назад для того чтобы скроллить вверх список сообщений в чате своего приложения
@YEVSU
@YEVSU 3 года назад
@@5treetart863 ок, спасибо, видимо я не разобрался
@volodymyr.od.ua.
@volodymyr.od.ua. 3 года назад
начал сегодня переход, написал RemoteMediator и столнулся с проблемой разных моделей для бд и для ui (( кто то уже нашёл как это обойти?
@AndroidBroadcast
@AndroidBroadcast 3 года назад
То же самое, поэтому даже не стал показывать пример. Надо чтобы улучшили этот момент, вряд ли они в Google делают одни и те же модели для всего.
@volodymyr.od.ua.
@volodymyr.od.ua. 3 года назад
@@AndroidBroadcast в Гугл репозитории в примере на гидхабе, используется одна модель)
@AndroidBroadcast
@AndroidBroadcast 3 года назад
Видел. Пример в вакууме
@dream_owner
@dream_owner 3 года назад
PagingData можно мапить
@AndroidBroadcast
@AndroidBroadcast 3 года назад
Да, но при создании Pager тебе нужны PagingSource и RemoteMediator, который имеют одинаковый ключ и тип данных, а маппить уже получиться только во Flow
@user-bn6ck9tm5y
@user-bn6ck9tm5y 3 года назад
Чтобы показать прогресс, можно было в эмуляторе ухудшить интернет
@AndroidBroadcast
@AndroidBroadcast 3 года назад
Спасибо, совсем забыл про эту возможность. Похоже надо сделать видео про возможности Android эмулятора
@alexandernifanin7366
@alexandernifanin7366 3 года назад
А эта опция работает? Года 4 назад ни на Винде, ни на Маке не работала.
@dxnbrawn
@dxnbrawn 3 года назад
Использую пагинатор от цховребова
@user-ou9ft3yw3h
@user-ou9ft3yw3h 3 года назад
Конченый автомат?)
@dxnbrawn
@dxnbrawn 3 года назад
@@user-ou9ft3yw3h угу он самый
@Igor-yh4gl
@Igor-yh4gl 3 года назад
Очень мелкий шрифт
@AndroidBroadcast
@AndroidBroadcast 3 года назад
На каком экране смотрели (диагональ и разрешение)?
@Igor-yh4gl
@Igor-yh4gl 3 года назад
@@AndroidBroadcast 13'' (макбук), пришлось переключится в 1080, иначе не разобрать было
@user-xs3wx8vy8g
@user-xs3wx8vy8g 3 года назад
Очень тяжело. На таких скоростях. Контент не для начинающих. Вообще все голопом ни чего не понял.
@AndroidBroadcast
@AndroidBroadcast 3 года назад
Все верно. Контент для начинающих. Прелесть видео, что можно посмотреть еще раз )
@user-xs3wx8vy8g
@user-xs3wx8vy8g 3 года назад
@@AndroidBroadcast много о себе думать вредно.
Далее
Что нового в Kotlin 1.5.0?
15:10
Просмотров 9 тыс.
Dagger Component, Subcomponent, Scope, Reusable
22:38
СПАЛИЛА МАМЕ СТАРШУЮ СЕСТРУ
00:23
MVI в Android на практике
19:20
Просмотров 15 тыс.
Aura 879dsp новинка и хит
0:48
Просмотров 160 тыс.
Здесь упор в процессор
18:02
Просмотров 382 тыс.