如何在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
相关产品推荐
相关产品推荐

