You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在AsyncTask加载时实现旋转ProgressBar并隐藏RecyclerView(替代废弃ProgressDialog)

替代废弃ProgressDialog:AsyncTask加载时显示ProgressBar并隐藏RecyclerView的实现

刚好之前处理过类似的需求,既然ProgressDialog在API 26已经被废弃,咱们可以直接在布局中添加一个自定义的ProgressBar,通过控制View的显示状态来实现需求,这样不仅更灵活,还能贴合你的UI设计,具体步骤如下:

1. 修改布局文件,添加ProgressBar

在你的FrameLayout中新增一个ProgressBar,和RecyclerView同级。我们可以设置初始状态下ProgressBar可见,RecyclerView隐藏,等数据加载完成后再切换状态:

<FrameLayout 
    android:layout_height="match_parent" 
    android:layout_width="match_parent" 
    xmlns:android="http://schemas.android.com/apk/res/android" > 

    <!-- 数据加载时显示的进度条 -->
    <ProgressBar
        android:id="@+id/loading_progress_bar"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        <!-- 启用环形加载动画 -->
        android:indeterminate="true"/>

    <!-- 列表视图,初始隐藏 -->
    <android.support.v7.widget.RecyclerView 
        android:id="@+id/photo_recycler_view" 
        android:layout_width="match_parent" 
        android:layout_height="match_parent"
        android:visibility="gone"/> 

</FrameLayout>

2. 调整AsyncTask及相关逻辑

在启动异步任务前,先显示ProgressBar并隐藏RecyclerView;在任务完成(onPostExecute)后,再隐藏ProgressBar,显示RecyclerView并设置适配器:

// 在类中声明控件引用
private RecyclerView mPhotoRecyclerView;
private ProgressBar mLoadingProgressBar;

// 初始化控件(建议在Activity/Fragment的onCreate方法中)
mPhotoRecyclerView = findViewById(R.id.photo_recycler_view);
mLoadingProgressBar = findViewById(R.id.loading_progress_bar);

// 修改后的FetchItemsTask
private class FetchItemsTask extends AsyncTask<Void, Void, List<GalleryItem>> { 
    private String mQuery; 

    public FetchItemsTask(String query) { 
        mQuery = query; 
    } 

    // 任务执行前的准备:显示进度条,隐藏列表
    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        mLoadingProgressBar.setVisibility(View.VISIBLE);
        mPhotoRecyclerView.setVisibility(View.GONE);
    }

    @Override 
    protected List<GalleryItem> doInBackground(Void... params) { 
        if (mQuery == null) { 
            return new FlickrFetchr().fetchRecentPhotos(); 
        } else { 
            return new FlickrFetchr().searchPhotos(mQuery); 
        } 
    } 

    @Override 
    protected void onPostExecute(List<GalleryItem> galleryItems) { 
        // 加载完成:隐藏进度条,显示列表
        mLoadingProgressBar.setVisibility(View.GONE);
        mPhotoRecyclerView.setVisibility(View.VISIBLE);
        
        mItems = galleryItems; 
        setupAdapter(); 
    } 
}

额外优化建议

  • 你可以自定义ProgressBar的样式,比如修改颜色、大小,或者替换为自定义drawable,让加载动画更贴合App风格;
  • 如果加载过程中出现异常,可以新增一个错误提示View,在doInBackground捕获异常后,在onPostExecute中切换到错误视图,提升用户体验。

内容的提问来源于stack exchange,提问作者SS-Salt

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:25:28