Комментарии 26
Вот здесь есть замечательное видео на тему от профессионалов.
https://www.youtube.com/watch?v=g7wwybnXE40
Если честно, тщательно даже читать статью не стал - вероятность того, что Вы изобрели что-то лучше просто ничтожна. И почти уверен, что просмотрев видео Вы найдете у себя в реализации по крайней мере 1 существенный недостаток, а скорее всего - больше.
В любом случае, спасибо, что поделились, другим новичкам может серьезно помочь)
P.s.
> Есть вопрос про подгузку данных. Как вы думаете, насколько необходимо ее осуществлять при работе с БД на устройстве?
Зависит от того, что лежит в БД. Во-первых структура может быть сложной и тянущей данные со множества таблиц, тогда загрузка всех данных может занимать вплоть до минут, что непозволительно долго. Во-вторых, данных могут быть десятки тысяч строк, тогда даже сравнительно простая структура будет тянуться уже не мгновенно.
Для работы со списками есть удобная библиотека FastAdapter. Там есть и бесконечный скроллинг, и подгрузка страницами.
Спасибо. Поищу в сети, посмотрю.
Есть ещё brvah. Конкретно про пагинацию(постепенную подгрузку)
Долго я искал в сети способ сделать так, чтобы данные при построении списка RecyclerView не загружались целиком, а подгружались по мере его пролистывания пользователем. Несколько совершенно разных решений находил на StackOverflow. Пробовал применить — работало, но каждый раз, как-то криво и не надежно.
Библиотека Paging из Jetpack'a, уже в третьей версии
fun updateAdapter(items: ArrayList<ListMeetings>, clear: Boolean = true){ if (clear) listItems.clear() listItems.addAll(items) notifyDataSetChanged() }
notifyDataSetChanged() — можноненадо весь список перерисовывать. DiffUtils в школу скоро пойдет.
fun removeItem(pos: Int, calManager: CalManager){ // удаляем элемент из списка calManager.deleteMeeting(listItems[pos].uri) // удаляем встречу из календаря listItems.removeAt(pos) // удаляем элемент из списка с позиции pos notifyItemRangeChanged(0,listItems.size) // указываем адаптеру новый диапазон элементов notifyItemRemoved(pos) // указываем адаптеру, что один элемент удалился }
Зачем здесь notifyItemRangeChanged? Вы уже сказали списку, что один элемент удален — он умный, поймет, что надо сделать. Алсо, у вас здесь баг: за счет того, что размер listItems в момент вызова меньше, чем число элементов в адаптере — вы оставите последний элемент в списке необновленным.
Всего-то нужно было загуглить "android paging library". В первой ссылке либа от гугла, и не нужны были бы вот эти все велосипеды.
Я так понял, что динамический поиск (лупа вверху списка) будет работать только по загруженным данным.
Нет. У меня поиск осуществляется по Базе Данных.
так чтобы именно динамический поиск (т.е. поиск когда вводишь первую букву - появляются список, втору - он короче, третью - еще короче) работал, ему нужен полный список, или сразу онлайн обмен с сервером ко всем данным, участвующим в поиске
Да, так и есть. У меня локальная База Данных на устройстве. Из нее и осуществляется поиск. Список обновляется при вводе каждой новой буквы.
private fun initSearchView(){
(activity as MainActivity).el.searchView.setOnQueryTextListener(object: SearchView.OnQueryTextListener{
override fun onQueryTextSubmit(query: String?): Boolean {
// запускается, когда мы нажимаем лупу на виртуальной клавиатуре
return true
}
override fun onQueryTextChange(newText: String?): Boolean {
// запускается каждый раз, когда мы вводим очередную букву
searchText = newText!!
fillAdapter()
return true
}
})
}
Просто я в статье для простоты изложения убрал параметр searchText из функции fillAdapter().
Шел 2050 год, программисты до сих используют xml
Это плохо? Как можно без него обойтись в проектах под Android?
На корутины то далеко не все перешли, а ты про компоуз :)
Когда то использовал в проектах подобную реализацию, но здесь есть один нюанс если размер экрана позволяет не заполняться при первом вызове данных, скажем большой планшет или количество меньше и задается с апи то onScroll не будет вызываться и следующие данные не подгрузятся, решением этого было отказ от scrollListener'a и добавить проверку на onBindViewHolder
override fun onBindViewHolder(holder: ViewHolder<T, V>, position: Int) {
holder.bind(items[position], onItemBind)
if (position == items.lastIndex) {
onLastItemBind?.invoke()
}
}
На самом деле, в этой статье нет ничего нового оптыных разработчиков, и есть небольшие усложнения по коду, которые не очень хорошо видеть начинающим. Так как лучше перенимать сразу более лучшие решения и понимание инструментов.
В качестве ответа на твой вопрос, как можно реализовать уже привели примеры. Та же библиотека с пагинацией активно используется (https://youtu.be/9zVmYVDTcEM) *Ну и для необходимости пагинации надо также смотреть на остальной код. Грубо говоря если не тяжело достать данные разом и держать их в переменной, то проще сделать именно так. RecyclerView как раз содержит в себе решение, что он не будет отображать и рисовать те вьюшки, которые "слишком далеко"
Но я бы хотел сказать спасибо, что не боишься делиться своими мыслями и решениями :) И хотел бы дать несколько советов по самой статье. Как автор ты должен хорошо разбираться в том, о чем говоришь. То бишь здесь стоит изучить и сам RecyclerView, viewBinding и прочее (либо стараться упоминать в нейтральном ключе). Просто ты как автор несёшь дальше ответственность, что за тобой наверняка кто-то будет повторять и приводит в пример статью)
Спасибо за столь подробный комментарий. Я расту и по мере более лучшего понимания материала буду править код и улучшать статью. Может быть, я плохо гуглил, но не смог найти на русском языке подобное описание реализации "динамической подгрузки данных" (для меня, человека не из IT, эта фраза звучит более подходящей, чем упомянутая многими комментаторами "пагинация"). Дайте ссылку на текст, если я не прав. Видео обязательно посмотрю... Спасибо!
Android Studio. Kotlin. Динамическая подгрузка данных в список RecyclerView