отображение индикатора выполнения с библиотекой подкачки Android

Я использую библиотеку подкачки и комнату, делая мою комнату db единственным слоем истины моего приложения. когда выборка выполняется с сервера с использованием модернизации, я сохраняю результат локально в базе данных, затем я получаю данные из базы данных с помощью библиотеки подкачки. Я использую BoundaryCallback.

@Override
    public void onZeroItemsLoaded() {
        requestAndSaveData();
    }
    @Override
    public void onItemAtEndLoaded(@NonNull Photo itemAtEnd) {
        requestAndSaveData();
}

 private void requestAndSaveData() {
        if (isRequestInProgress) return;
        isRequestInProgress = true;
        apiInterface.getPhotos(lastRequestPage, NETWORK_PAGE_SIZE).enqueue(new Callback<PhotoList>() {
            @Override
            public void onResponse(Call<PhotoList> call, Response<PhotoList> response) {
                if (response.isSuccessful()) {
                    cache.insertPhotos(response.body().getHits()); //todo only save 20 - 40 items
                    lastRequestPage++;
                    isRequestInProgress = false;
                    Log.i("deb", "number from boundary: " + response.body().getHits().size());
                }
}

Когда в базе данных нет элемента или пользователь прокручивает до последнего элемента, я вызываю метод requestAndSaveData(), который извлекает данные с сервера и сохраняет их в базе данных.

Мой вопрос: как показать индикатор выполнения внизу списка при загрузке следующей страницы с сервера и сохранении ее в базе данных, поскольку это может занять много времени?


person M.Ali    schedule 23.06.2018    source источник
comment
Вы хотите, чтобы индикатор выполнения был в конце списка или загружался на поверхность экрана?   -  person Khemraj Sharma    schedule 23.06.2018
comment
в конце списка   -  person M.Ali    schedule 23.06.2018


Ответы (3)


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

Во-вторых, вы можете легко отобразить индикатор загрузки внизу вашего списка, добавив в список дополнительную ячейку, которая предназначена только для отображения индикатора загрузки, аналогичная идея используется здесь для отображения статуса сети:

https://github.com/googlesamples/android-architecture-components/blob/master/PagingWithNetworkSample/lib/src/main/java/com/android/example/paging/pagingwithnetwork/reddit/PostsAdapter.kt

person Keivan Esbati    schedule 30.06.2018
comment
@MarioBouchedid, упаковка изменена, вы можете найти упомянутый выше класс здесь: github.com/googlesamples/android-architecture-components/blob/ - person Keivan Esbati; 14.07.2019
comment
Перешли на пейджинговую 3 версию. Вот старое решение. reddit / ui / PostsAdapter.kt "rel =" nofollow noreferrer "> github.com/android/architecture-components-samples/blob/ - person Dimon; 13.01.2021

Поместите компонент ProgressBar в свой макет xml. Затем измените его видимость в соответствии с вызовом API.

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <android.support.v7.widget.RecyclerView
        android:id="@+id/rv"
        style="@style/recyclerViewDefaultStyle" />

    <ProgressBar
        android:id="@+id/pb"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        android:visibility="gone" />

</LinearLayout>

В вашей деятельности

import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.ProgressBar;

import in.ks.widgetClock.R;

/**
 * Created by KHEMRAJ on 6/23/2018.
 */
public class Sample extends AppCompatActivity {
    ProgressBar progressBar;

    private void showProgressBar() {
        progressBar.setVisibility(View.VISIBLE);
    }

    private void hideProgressBar() {
        progressBar.setVisibility(View.GONE);
    }

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        ...
        progressBar = findViewById(R.id.pb);
        ...
    }

    private void requestAndSaveData() {
        if (isRequestInProgress) return;
        isRequestInProgress = true;
        showProgressBar();
        apiInterface.getPhotos(lastRequestPage, NETWORK_PAGE_SIZE).
                enqueue(new Callback<PhotoList>() {
                    @Override
                    public void onResponse(Call<PhotoList> call, Response<PhotoList> response) {
                        hideProgressBar();
                        if (response.isSuccessful()) {
                            cache.insertPhotos(response.body().getHits()); //todo only save 20 - 40 items
                            lastRequestPage++;
                            isRequestInProgress = false;
                            Log.i("deb", "number from boundary: " + response.body().getHits().size());
                        }
                    }
                }
    }

}
person Khemraj Sharma    schedule 23.06.2018
comment
это будет работать нормально в случае отображения его на поверхности экрана, но я хочу показать его внизу списка при загрузке следующей страницы - person M.Ali; 23.06.2018
comment
Обратите внимание, что я использовал LinearLayout с вертикальной ориентацией, что сделает ваш индикатор выполнения ниже в списке. - person Khemraj Sharma; 23.06.2018
comment
я хочу добиться этого, как в этом примере: github.com/googlesamples/ Android-архитектура-компоненты / дерево / - person M.Ali; 23.06.2018

Предоставьте заполнители в пользовательском интерфейсе:

Я не нуждаюсь в этом, если вы используете заполнитель, и он также имеет преимущество, см. Ниже:

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

Источник: https://developer.android.com/topic/libraries/architecture/paging/ui

person Eddy sapata    schedule 07.02.2020
comment
не требуется, только если вы заранее знаете размер списка. - person Rahul Tiwari; 07.07.2020