使用Android分页库显示进度条

8
我正在使用分页库和Room,将我的Room数据库作为应用程序的唯一真相层。当使用Retrofit从服务器获取数据时,我会将结果保存在本地数据库中,然后使用分页库从数据库中获取数据。我正在使用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()方法从服务器获取数据并将其保存到数据库中。我的问题是如何在从服务器加载下一页并将其保存到数据库时,在列表底部显示进度条,因为这可能需要很长时间?

你想在列表末尾显示进度条,还是在屏幕表面显示加载状态? - Khemraj Sharma
在列表末尾返回已翻译的文本 - M.Ali
3个回答

6
首先,您可以通过询问如何在RecyclerView底部显示加载指示器来扩大问题范围,而不是将其局限于分页库。
其次,您可以通过向列表中添加一个额外的单元格来仅用于显示加载指示器,从而轻松在列表底部显示加载指示器,类似的思路已在此处用于显示网络状态:

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


@MarioBouchedid,包装已更改,您可以在此处找到上述类:https://github.com/googlesamples/android-architecture-components/blob/master/PagingWithNetworkSample/lib/src/main/java/com/android/example/paging/pagingwithnetwork/reddit/ui/PostsAdapter.kt - Keivan Esbati
他们已经升级到分页3版本。这是旧的解决方案:https://github.com/android/architecture-components-samples/blob/6a961faad1b2e5a4ee853c1d343747d0a34dfa0e/PagingWithNetworkSample/lib/src/main/java/com/android/example/paging/pagingwithnetwork/reddit/ui/PostsAdapter.kt - Dimon

-1

在您的布局 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());
                        }
                    }
                }
    }

}

1
这在屏幕表面显示时可以正常工作,但我想在加载下一页时将其显示在列表底部。 - M.Ali
请注意,我已经使用了垂直方向的LinearLayout,这将使您的进度条位于列表下方。 - Khemraj Sharma
我想像这个例子一样实现它:https://github.com/googlesamples/android-architecture-components/tree/master/PagingWithNetworkSample - M.Ali

-1

在您的用户界面中提供占位符:

如果您使用占位符,我认为这并不需要,而且它也有优点,请参见下文:

无需加载旋转器:由于列表大小已知,因此无需通知用户正在加载更多项目。占位符本身传达了该信息。

来源:https://developer.android.com/topic/libraries/architecture/paging/ui


如果您事先知道列表的大小,则不需要not needed。 - Rahul Tiwari

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接