如何实现不确定的加载屏幕

How to implement indeterminate loading screen

我正在构建一个使用 REST 接口获取数据的应用程序。通常,我会调用 setProgressBarIndeterminateVisibility(true); 让用户知道应用正在等待数据。然而,这似乎是 deprecated:

Progress bars are no longer provided in AppCompat.

在查看 GMail 应用程序时,我看到有一个不确定的进度条(加载图标)全屏,数据即将到来。

我该如何正确实施?一些活动是从 ListViewActivity 扩展而来的,并在没有可用数据时使用 setEmptyView 显示简单的 TextView。有些是更精细的布局。

我可以考虑使用 setVisibility(View.GONE),但想知道这是否是 "right" 的方法。

是的。这是正确的方法。只需将所有内容布置在 XML 上应有的位置,并在必要时在进度条上调用 setVisibility

知道"when"调用的方法通常有两种。

  1. 关于您的 REST 回调(例如 onSuccess()onStartLoading()
  2. 在您的适配器上使用 DataSetObserver(这正是 ListView 所做的)。喜欢下面的代码:

.

@Override
protected void onStart(){
   super.onStart()
   observer.onChanged();
   adapter.registerDataSetObserver(observer);
}

@Override
protected void onStop(){
   super.onStop()
   adapter.unregisterDataSetObserver(observer);
}

private DataSetObserver observer = new DataSetObserver(){
   @Override
   public void onChanged() {
       progress.setVisibility(adapter.getCount()==0?View.VISIBLE:View.GONE);
   }
}

将您的内容布局包装到 FrameLayout 中。添加到 FrameLayout 类似这样的内容:

<LinearLayout
    android:id="@+id/loading_progress"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center"
    android:orientation="vertical"
    android:visibility="invisible">

    <ProgressBar
        android:layout_width="50dp"
        android:layout_height="50dp"
        android:indeterminate="true"/>

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="10dp"
        android:text="Loading data..."/>
</LinearLayout>

然后使用 .setVisibility(View.VISIBLE) / .setVisibility(View.INVISIBLE)

在代码中切换内容/进度层