我有一個Fragment
包含ViewPager
,現在ViewPager
包含3個不同的項目,即每個項目(頁)包含ListView
和每個列表HASE它省錢Adapter
,我不能使用FragmentPagerAdapter
爲ViewPager項目延遲加載數據
正弦ViewPager
住在Fragment
。
我是否應該在Fragment
中加載全部三個ListViews
數據並將它傳遞給PagerAdapter
?
我有一個Fragment
包含ViewPager
,現在ViewPager
包含3個不同的項目,即每個項目(頁)包含ListView
和每個列表HASE它省錢Adapter
,我不能使用FragmentPagerAdapter
爲ViewPager項目延遲加載數據
正弦ViewPager
住在Fragment
。
我是否應該在Fragment
中加載全部三個ListViews
數據並將它傳遞給PagerAdapter
?
其實它取決於你加載的數據有多大?
如果它很大,請嘗試下載ie。每個頁面有10個項目,並將這些數據傳遞給適配器並進行緩存。之後,實現懶惰的加載器(如在谷歌播放應用程序),它爲您的正確頁面下載您的下一個項目,而不是所有。
因此,所有的三頁將有數據顯示在第一負載,如果用戶想要更多,他可以導航到你的列表的底部,按「加載更多」,並獲得更多的項目:)
從我的這種解決方案的經驗很好。當然,這種裝載機應該採用服務器端。
還有更多的考慮,即。也許你的數據「非常活躍」。所以你必須考慮它。
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()
你找到這個答案? – intrepidkarthi
是的,你想要答案嗎? – user4o01
你能分享一下提示嗎?這對我來說真的很有幫助。 – techieWings