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

FragmentPagerAdapter ViewPager 無法顯示資料?移除 isViewFromObject 覆寫

     編輯:程式設計綜合問答

問題現象

使用 ViewPager + FragmentPagerAdapter 實現分頁切換,頁面能滑動但 Fragment 內容空白,onCreateView 不被呼叫或視圖不顯示。

根本原因

開發者在 TabsAdapter 中覆寫了 isViewFromObject(View, Object) 並回傳 view == obj。FragmentPagerAdapter 父類已正確實作此方法(比較 Fragment 的 View 與 Object),子類覆寫導致邏輯錯誤,使 ViewPager 無法正確關聯 Fragment 與視圖。

解決方案

刪除 Adapter 中的 isViewFromObject 覆寫方法,直接繼承父類實作。

public class TabsAdapter extends FragmentPagerAdapter {
    private List<CommendFragment> fragments;

    public TabsAdapter(FragmentManager fm, List<CommendFragment> list) {
        super(fm, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT); // 推薦傳入行為旗標
        this.fragments = list;
    }

    @Override
    public int getCount() {
        return fragments.size();
    }

    @Override
    public Fragment getItem(int position) {
        return fragments.get(position);
    }

    // ❌ 刪除這個方法!
    // @Override
    // public boolean isViewFromObject(View view, Object obj) {
    //     return view == obj;
    // }
}

補充最佳實踐

  • 使用 FragmentStatePagerAdapter:若頁面較多(>3-4),建議改用 FragmentStatePagerAdapter 銷毀不可见 Fragment 釋放記憶體。
  • 行為旗標:建構子傳入 BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT(API 14+),確保只有當前頁面處於 RESUME 狀態。
  • Fragment 生命週期:資料載入放在 onViewCreated 或 onResume,避免在 onCreateView 執行耗時操作導致卡頓。
  • ViewPager2 遷移:新專案請直接使用 ViewPager2 + FragmentStateAdapter,支援垂直滑動、RTL、DiffUtil 動畫。

常見誤區對比

錯誤做法正確做法
覆寫 isViewFromObject 回傳 view == obj完全不覆寫,使用父類實作
getItem 每次 new Fragment()建構子接收預建 List 或用位置標識懶加載
Fragment 持有大量 Bitmap 導致 OOM使用 Glide/Coil 載入圖片,onDestroyView 釋放資源

移除錯誤覆寫後,ViewPager 即可正常顯示各 Fragment 內容。

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