2012-09-17 63 views
1

我有一個Fragment包含ViewPager,現在ViewPager包含3個不同的項目,即每個項目(頁)包含ListView和每個列表HASE它省錢Adapter,我不能使用FragmentPagerAdapter爲ViewPager項目延遲加載數據

正弦ViewPager住在Fragment

我是否應該在Fragment中加載全部三個ListViews數據並將它傳遞給PagerAdapter

+0

你找到這個答案? – intrepidkarthi

+0

是的,你想要答案嗎? – user4o01

+0

你能分享一下提示嗎?這對我來說真的很有幫助。 – techieWings

回答

2

其實它取決於你加載的數據有多大?

如果它很大,請嘗試下載ie。每個頁面有10個項目,並將這些數據傳遞給適配器並進行緩存。之後,實現懶惰的加載器(如在谷歌播放應用程序),它爲您的正確頁面下載您的下一個項目,而不是所有。

因此,所有的三頁將有數據顯示在第一負載,如果用戶想要更多,他可以導航到你的列表的底部,按「加載更多」,並獲得更多的項目:)

從我的這種解決方案的經驗很好。當然,這種裝載機應該採用服務器端。

還有更多的考慮,即。也許你的數據「非常活躍」。所以你必須考慮它。

1
public abstract class BaseLazyFragment extends Fragment { 

    protected boolean isVisible; 


    /** 
    * to judge if is visible to user 
    * @param isVisibleToUser 
    */ 
    @Override 
    public void setUserVisibleHint(boolean isVisibleToUser) { 
     super.setUserVisibleHint(isVisibleToUser); 

     if(getUserVisibleHint()) { 
      this.isVisible = true; 
      onVisible(); 
     } else { 
      this.isVisible = false; 
      onInvisible(); 
     } 

    } 


    /** 
    * when the fragment is not visible to user 
    */ 
    protected void onInvisible() { 
     Loggy.e("do onInvisible"); 
    } 

    /** 
    * when the fragment is visible to user 
    * 
    * lazyload 
    */ 
    protected void onVisible() { 
     Loggy.e("do onVisible---"); 
     lazyLoad(); 
    } 

    protected abstract void lazyLoad(); 

    } 

則可以創建一個客戶片段延伸BaseLazyFragment 例如

public class NewsFragment extends BaseLazyFragment { 

    private boolean isPrepared; 
    //a flag to judge init action has finished 

    @Nullable 
    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 

     View view = inflater.inflate(R.layout.fragment_news_page,null); 

     //do init 

     // when init is finish , set flag true; 
     isPrepared = true; 

     lazyLoad(); 

     return view; 
    } 

    @Override 
    protected void lazyLoad() { 

     // according this judge, can prevent nullpointerexception 
     if(!isPrepared || !isVisible){ 
      return; 
     } 

     // assignment the view 
     // get data from network assignment to varible 
    } 
} 

setUserVisibleHint()

在第一時間時的片段創建setUserVisibleHint()方法是頭比onCreateView(),所以lazyLoad()方法可能會拋出NullPoin terException因爲oncreateView()沒有被調用,所以你應該創建一個標誌變量 - > isPrepared。

onCreateView()

reference link