私はページングライブラリとルームを使用しており、ルームデータベースをアプリの真実の単一レイヤーとして作成しています。レトロフィットを使用してサーバーからフェッチを行う場合、結果をローカルにデータベースに保存してから、ページングライブラリを使用してデータベースからデータを取得します。 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()
メソッドを呼び出します。
私の質問は、サーバーから次のページをロードしてデータベースに保存するときに、リストの下部にプログレスバーを表示する方法です。これには時間がかかる場合がありますか?
まず、ページングライブラリに絞り込むのではなく、RecyclerView
の下部に読み込みインジケーターを表示する方法について質問することで、質問の範囲を広げることができます。
次に、負荷インジケーターを表示するためだけのセルをリストに追加することで、リストの下部に負荷インジケーターを簡単に表示できます。ここでは、同様の考え方を使用してネットワークステータスを表示します。
UIにプレースホルダーを提供します:
プレースホルダーを使用している場合、これは必要ありません。以下を参照してください。
ロードスピナーは不要:リストサイズはすでにわかっているため、さらにアイテムがロードされていることをユーザーに警告する必要はありません。プレースホルダー自体がその情報を伝えます。
ソース: https://developer.Android.com/topic/libraries/architecture/paging/ui
レイアウト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());
}
}
}
}
}