首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

ViewPager + Fragment:動態顯示加載進度條的最佳實踐

     編輯:程式設計疑難解答

場景描述

使用 ViewPager 搭配 Fragment 實現多頁籤(A、B、C 三頁)。需求:用戶滑動到 B、C 頁時,先顯示圓環進度條,數據加載完成後再顯示具體內容。

推薦方案:Fragment 內部視圖控制

無需切換佈局文件,直接在 Fragment 中通過 View.setVisibility() 控制進度條與內容視圖的顯隱:

佈局文件

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

    <!-- 真實內容 -->
    <RecyclerView
        android:id="@+id/recyclerView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:visibility="gone" />

    <!-- 加載進度條,居中顯示 -->
    <ProgressBar
        android:id="@+id/progressBar"
        style="?android:attr/progressBarStyleLarge"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:visibility="visible" />
</FrameLayout>

Fragment 代碼

public class MyFragment extends Fragment {
    private ProgressBar progressBar;
    private RecyclerView recyclerView;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_my, container, false);
        progressBar = view.findViewById(R.id.progressBar);
        recyclerView = view.findViewById(R.id.recyclerView);
        return view;
    }

    @Override
    public void setUserVisibleHint(boolean isVisibleToUser) {
        super.setUserVisibleHint(isVisibleToUser);
        if (isVisibleToUser && isAdded()) {
            // 頁面真正對用戶可見時觸發
            loadData();
        }
    }

    private void loadData() {
        // 1. 顯示進度條,隱藏內容
        progressBar.setVisibility(View.VISIBLE);
        recyclerView.setVisibility(View.GONE);

        // 2. 模擬異步加載
        new Handler(Looper.getMainLooper()).postDelayed(() -> {
            // 更新適配器數據...
            recyclerView.setAdapter(new MyAdapter(dataList));

            // 3. 加載完成:隱藏進度條,顯示內容
            progressBar.setVisibility(View.GONE);
            recyclerView.setVisibility(View.VISIBLE);
        }, 1500);
    }
}

關鍵點解析

  • setUserVisibleHint():ViewPager 預加載機制下,僅當 Fragment 真正對用戶可見時返回 true,適合觸發數據加載
  • FrameLayout 疊加:進度條與內容佔據同一位置,通過 Visibility 切換,無需佈局切換開銷
  • 生命周期配合:結合 isAdded() 判斷 Fragment 是否已附加到 Activity,避免空指針

替代方案:Dialog / PopupWindow

若需更強的模態感,可在 loadData() 開始時 dialog.show(),結束時 dialog.dismiss()。但頁面內疊加方案體驗更流暢,推薦優先使用。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved