web-dev-qa-db-ja.com

Androidページングライブラリで進行状況バーを表示する

私はページングライブラリとルームを使用しており、ルームデータベースをアプリの真実の単一レイヤーとして作成しています。レトロフィットを使用してサーバーからフェッチを行う場合、結果をローカルにデータベースに保存してから、ページングライブラリを使用してデータベースからデータを取得します。 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()メソッドを呼び出します。

私の質問は、サーバーから次のページをロードしてデータベースに保存するときに、リストの下部にプログレスバーを表示する方法です。これには時間がかかる場合がありますか?

6
M.Ali

まず、ページングライブラリに絞り込むのではなく、RecyclerViewの下部に読み込みインジケーターを表示する方法について質問することで、質問の範囲を広げることができます。

次に、負荷インジケーターを表示するためだけのセルをリストに追加することで、リストの下部に負荷インジケーターを簡単に表示できます。ここでは、同様の考え方を使用してネットワークステータスを表示します。

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

4
Keivan Esbati

UIにプレースホルダーを提供します:

プレースホルダーを使用している場合、これは必要ありません。以下を参照してください。

ロードスピナーは不要:リストサイズはすでにわかっているため、さらにアイテムがロードされていることをユーザーに警告する必要はありません。プレースホルダー自体がその情報を伝えます。

ソース: https://developer.Android.com/topic/libraries/architecture/paging/ui

0
Eddy sapata

レイアウトxml内にProgressBarコンポーネントを配置します。次に、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());
                        }
                    }
                }
    }

}
0
Khemraj