Сучасна диджитал-освіта для дітей — безоплатне заняття в GoITeens ×
Mazda CX 5
×

Android autoload onScroll

Підписуйтеся на Telegram-канал «DOU #tech», щоб не пропустити нові технічні статті

Недавно почав вивчати андроїд і роблю простий додаток типу стіна новин.

Суть проста: на головному екрані список новин при скролі внизу старші публікації підгружаються + фільтер по тегам. Типу читання блогу на android native.

Дані тягнуться через rest api.

Але не знаю як люди роблять правильно автопідгрузку.
Зараз зробив через AsyncTaskLoader з 5 перевірками аби не тянуло дані коли не треба, але здається щось тут не те. Та й зберігати дані в змінній static якось не те.

Що порадите? Потрібно аби було швидким + при ротації телефону нормально працювало.

UPDATE: Розібрався. Поки буду юзати фрагмент + setRetainInstance(true). Потім може щось покруче придумаю, з sqlite, але зараз поки так і залишив.

👍ПодобаєтьсяСподобалось0
До обраногоВ обраному0
LinkedIn
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter

Как говорил Линус Торвальдс болтовня ничего не стоит, покажите мне код)
Лично я просто добавил слушатель на скролл для recycler view, и увеличивал offset для загрузки,затем передавал новый offset в функцию для загрузки и передавал новые данные в адаптер. Данные сохраняю в презентере.

public RecyclerView.OnScrollListener getOnScrollListener(final LinearLayoutManager mLayoutManager) {
        return new RecyclerView.OnScrollListener() {
            @Override
            public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
                super.onScrolled(recyclerView, dx, dy);
                if (!blockScroll) {

                    if (dy > 0) // check for scroll down
                    {
                        int visibleItemCount = mLayoutManager.getChildCount();
                        int totalItemCount = mLayoutManager.getItemCount();
                        int pastVisibleItems = mLayoutManager.findFirstVisibleItemPosition();

                        if (loading)
                            if ((visibleItemCount + pastVisibleItems) >= totalItemCount) {
                                if (isNextPageExist) {
                                    if (mView.isOnline()) {
                                        loading = false;
                                        currentOffset = currentOffset + 10;
                                        mView.showProgressBar();
                                        downloadContent();
                                    }
                            }
                    }
                }
            }
          }
        };
    }

Для работы с Rest Api — Retrofit 2
Для сохранения в базе для офлайна — Room +SQLlight(или NoSql Hawk)
Для отображения списка — RecyclerView (Для автоподгрузки при скроле — RecyclerView infinite scroll)
Для подгрузки картинок — Glide
Этого с головой хватит, чтобы сделать новостную ленту

AsyncTask->Loader->RxJava обычно такой путь разработчик проходит,при написании запросов в сеть.Только перескакивать не нужно.Грузите в переменную во фрагменте,сохраняйте переменную при смене ориентации,и затем восстанавливайте.

всякое и в картинках про RecyclerView от разрабов
по остальному — крайне обширная предметная область, минимум должны прочитать developer.android.com/...​ide/components/index.html особенно по лоадерам и фрагментам (lifecycles, retain state etc)

де зберігати дані під час ротації телефону?
я зараз використовую static List в MainActivity, але думаю це не найкращий варіант

Не обязательно сохранять данные в базу чтобы использовать лоадер.

А кэшировать данные в каком-то репозитории-синглтоне как вариант? Посмотрите примеры от гугла: github.com/...​ples/android-architecture
Посмотрите сначала первый сампл (пустой мвп). По мере эволюции смотрите дальше в порядке, который указали выше.

Вы должны были использовать ListView или RecyclerView. Если да- гуглите www.google.com/...​yclerview infinite scroll

Підписатись на коментарі