巧力避免ViewPager的預載入資料,Tablayout+Fragment+viewPager
阿新 • • 發佈:2019-01-24
問題描述
最近在進行一個專案的開發,其中使用到了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() { //所有初始化資料的操作都在這裡進行 } 我這樣就解決了我的問題。