2013-06-19 26 views
0

由於viewpager預載了在其中使用的片段的+1和-1。我使用asyntask加載數據,我希望只在頁面本身執行時執行。在Android ViewPager上加載繁重任務的正確方法是什麼?

我應該在哪裏執行該功能? oncreate似乎不適用於我

+1

整點的viewpager加載上一頁和下一頁就是這樣,當你到達那裏所有的內容都準備好,並加載到 – tyczj

回答

1

由Tanis提供的解決方案應該可行,但有一種認爲應該考慮。由於AsyncTaskActivity開始,所以在處理配置更改時可能會遇到一些問題。也許直接從片段開始AsyncTask會更有意義。

然後,解決方案將使當前顯示的片段知道他是現在顯示的片段。

首先,你應該在你的活性的方法,將返回當前片段的位置從ViewPager

public class MainActivity extends Activity{ 

    //.... 
    public int getViewPagerCurrentIndex() { 
    return pager.getCurrentItem(); 
    } 
} 

其次,在你的PagerAdaptergetItem()方法作爲參數傳遞到當前項目的位置片段:

public class MyPagerAdapter extends FragmentStatePagerAdapter { 
    //.... 

    @Override 
    public Fragment getItem(int position) { 
     return MyFragment.newInstance(position); 
    } 
} 

最後,檢查MyFragment這兩個位置從MainActivity返回和接收的位置時,該片段是我實際的比賽。如果它們匹配片段的這個實例可見:

public static MyFragment newInstance(int position) { 
    MyFragment fragment = new MyFragment(); 
    Bundle args = new Bundle(); 
    args.putInt(KEY_POSITION, position); 
    fragment.setArguments(args); 
    return fragment; 
} 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setRetainInstance(true); 
    if (getArguments() != null) {    
    fragmentPosition = getArguments().getInt(KEY_POSITION); 
    } 
} 

// It does not matter where this method is called, the AsyncTask will be started only for the currently visible fragment. 
private void executeAsyncTask(){ 
    MainActivity mainActivity = (MainActivity)getActivity(); 
    if (mainActivity.getViewPagerCurrentIndex() == fragmentPosition) { 
     new MyAsyncTask().execute(); 
    } 
} 
2

您可以實施ViewPager.OnPageChangeListener並在onPageSelected()中運行您的AsyncTask。

例如:

public class MyActivity implements ViewPager.OnPageChangeListener { 
    @Override 
    public void onPageSelected(int position) { 
     new MyAsyncTask().execute(); 
    } 
} 

然而,隨着Tyczj在評論中指出,這違背了一個ViewPager的努力保持加載次數的目的。此功能旨在讓您的應用看起來流暢,沒有它,視圖將在您加載數據時看起來爲空(或呈現其默認外觀)。

+0

'setOffscreenPageLimit(0) '不會工作,因爲'ViewPager'強制執行'DEFAULT_OFFSCREEN_PAGES'的下限,即'1'。 – CommonsWare

+0

啊,對了,我忘了那個。感謝您的澄清。 –

相關問題