отображение индикатора выполнения с библиотекой подкачки Android - PullRequest
0 голосов
/ 23 июня 2018

Я использую библиотеку подкачки и комнату, делая свою комнату дБ как единственный слой правдивости моего приложения.Когда выборка выполняется с сервера с использованием модернизации, я сохраняю результат локально в БД, затем я получаю данные из БД, используя библиотеку подкачки.Я использую 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() метод, которыйполучить данные с сервера и сохранить их в БД.

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

Ответы [ 2 ]

0 голосов
/ 30 июня 2018

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

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

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

0 голосов
/ 23 июня 2018

Поместите компонент 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());
                        }
                    }
                }
    }

}
...