由於viewpager預載了在其中使用的片段的+1和-1。我使用asyntask加載數據,我希望只在頁面本身執行時執行。在Android ViewPager上加載繁重任務的正確方法是什麼?
我應該在哪裏執行該功能? oncreate似乎不適用於我
由於viewpager預載了在其中使用的片段的+1和-1。我使用asyntask加載數據,我希望只在頁面本身執行時執行。在Android ViewPager上加載繁重任務的正確方法是什麼?
我應該在哪裏執行該功能? oncreate似乎不適用於我
由Tanis提供的解決方案應該可行,但有一種認爲應該考慮。由於AsyncTask
從Activity
開始,所以在處理配置更改時可能會遇到一些問題。也許直接從片段開始AsyncTask
會更有意義。
然後,解決方案將使當前顯示的片段知道他是現在顯示的片段。
首先,你應該在你的活性的方法,將返回當前片段的位置從ViewPager
:
public class MainActivity extends Activity{
//....
public int getViewPagerCurrentIndex() {
return pager.getCurrentItem();
}
}
其次,在你的PagerAdapter
在getItem()
方法作爲參數傳遞到當前項目的位置片段:
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();
}
}
您可以實施ViewPager.OnPageChangeListener
並在onPageSelected()
中運行您的AsyncTask。
例如:
public class MyActivity implements ViewPager.OnPageChangeListener {
@Override
public void onPageSelected(int position) {
new MyAsyncTask().execute();
}
}
然而,隨着Tyczj在評論中指出,這違背了一個ViewPager的努力保持加載次數的目的。此功能旨在讓您的應用看起來流暢,沒有它,視圖將在您加載數據時看起來爲空(或呈現其默認外觀)。
'setOffscreenPageLimit(0) '不會工作,因爲'ViewPager'強制執行'DEFAULT_OFFSCREEN_PAGES'的下限,即'1'。 – CommonsWare
啊,對了,我忘了那個。感謝您的澄清。 –
整點的viewpager加載上一頁和下一頁就是這樣,當你到達那裏所有的內容都準備好,並加載到 – tyczj