我正在使用分页库和room,使我的room db成为我应用程序的单层真相。当使用改造从服务器获取数据时,我将结果本地保存在db中,然后使用分页库从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()
方法,该方法从服务器获取数据并将其保存到数据库中。
我的问题是,从服务器加载下一页并将其保存到数据库时,如何在列表底部显示进度条,这可能需要很长时间?
答案 0 :(得分:3)
首先,您可以询问如何在RecyclerView
的底部显示一个加载指示器,而不是将其缩小到分页库,从而扩大问题范围。
第二,您可以通过在列表底部添加一个仅用于显示负载指示器的额外单元格来轻松地在列表底部显示负载指示器,此处使用类似的想法来显示网络状态:
答案 1 :(得分:0)
在布局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());
}
}
}
}
}
答案 2 :(得分:-1)
在用户界面中提供占位符:
如果您使用的是占位符,我不认为这有任何需要,并且它也具有以下优点:
无需加载微调器:由于列表大小已知,因此无需提醒用户正在加载更多项目。占位符本身传达了这些信息。
来源:https://developer.android.com/topic/libraries/architecture/paging/ui