1. 程式人生 > >巧力避免ViewPager的預載入資料,Tablayout+Fragment+viewPager

巧力避免ViewPager的預載入資料,Tablayout+Fragment+viewPager

問題描述

最近在進行一個專案的開發,其中使用到了Tablayout+Fragment+viewPager來搭建一個基本的框架,從而出現了設定資料介面卡的時候,item的位置錯亂問題。我列印log日誌的時候發現原來是,設定了兩次資料資料介面卡,考慮到ViewPager的預載入資料問題,我就想到了問題出現了在這裡。當我載入第一個tablayout的tab的時候,第二個tab的資料已經初始化完畢了,從而導致了資料介面卡設定了兩次的問題,也就出現了資料錯亂的問題。

解決方案

我使用了下面的方法就解決了問題。

在ViewPager初始化的時候對ViewPager進行監聽事件

   //設定監聽事件
        viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
            @Override
            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

            }

            @Override
            public void onPageSelected(int position) {
                //選中
               // 當該頁面選中時,才開始初始化當前頁面的資料
  mFragmentsLists.get(position).initData(); } @Override public void onPageScrollStateChanged(int state) { } });

//預設初始化第一頁的資料
mFragmentsLists.get(0).initData();

上面的程式碼片中,viewPager就是初始化的viewpager的控制元件,mFragmentsLists就是我們要顯示的中部的Fragment集合
對Viewpager設定了監聽事件,當那一頁被選中就初始化哪一頁的資料,從而避免了ViewPager預載入資料問題。
Fragment中的程式碼片段:
  // Fragment填充佈局
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
       //在這裡初始化Fragment的佈局
                 //但是不要初始化資料,不要在Fragment建立的時候呼叫initData()方法,等著外界資料呼叫
        return view;
    }
Fragment中的initData()方法:
    /**
     * 初始化資料
     */
    public void initData() {
        //所有初始化資料的操作都在這裡進行
    }

我這樣就解決了我的問題。