Как стать автором
Обновить

Комментарии 26

Вот здесь есть замечательное видео на тему от профессионалов.
https://www.youtube.com/watch?v=g7wwybnXE40

Если честно, тщательно даже читать статью не стал - вероятность того, что Вы изобрели что-то лучше просто ничтожна. И почти уверен, что просмотрев видео Вы найдете у себя в реализации по крайней мере 1 существенный недостаток, а скорее всего - больше.

В любом случае, спасибо, что поделились, другим новичкам может серьезно помочь)

P.s.

> Есть вопрос про подгузку данных. Как вы думаете, насколько необходимо ее осуществлять при работе с БД на устройстве?

Зависит от того, что лежит в БД. Во-первых структура может быть сложной и тянущей данные со множества таблиц, тогда загрузка всех данных может занимать вплоть до минут, что непозволительно долго. Во-вторых, данных могут быть десятки тысяч строк, тогда даже сравнительно простая структура будет тянуться уже не мгновенно.

Спасибо за ссылку на видео, обязательно посмотрю!

Для работы со списками есть удобная библиотека FastAdapter. Там есть и бесконечный скроллинг, и подгрузка страницами.

Спасибо. Поищу в сети, посмотрю.

Спасибо!

Долго я искал в сети способ сделать так, чтобы данные при построении списка 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?

ну jetpack compose например)

Спасибо. Как-нибудь и до него дорасту... Посмотрю.

Посмотрел несколько роликов про jetpack compose. Интересно. А если в проекте использую компоненты от других разработчиков, как быть? Ведь у них всех разметка сдеална в xml...

На корутины то далеко не все перешли, а ты про компоуз :)

Я, например, перешел. Просто из примеров кода в этой статье убрал, чтобы не пугать новичков. И так получился громоздкий гайд.

Когда то использовал в проектах подобную реализацию, но здесь есть один нюанс если размер экрана позволяет не заполняться при первом вызове данных, скажем большой планшет или количество меньше и задается с апи то 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, эта фраза звучит более подходящей, чем упомянутая многими комментаторами "пагинация"). Дайте ссылку на текст, если я не прав. Видео обязательно посмотрю... Спасибо!

На видео как раз последняя версия библиотеки, с описанием и примерами)

Названия технологий приходят из английского языка, так потихоньку привыкнешь, что и как искать :)

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации