作为 viewpager 预加载其中使用的片段的 +1 和 -1。我使用 asyntask 加载数据,我希望仅在页面本身时执行。
我应该在哪里执行该功能?oncreate 似乎对我不起作用
作为 viewpager 预加载其中使用的片段的 +1 和 -1。我使用 asyntask 加载数据,我希望仅在页面本身时执行。
我应该在哪里执行该功能?oncreate 似乎对我不起作用
您可以ViewPager.OnPageChangeListener
在onPageSelected()
.
例如:
public class MyActivity implements ViewPager.OnPageChangeListener {
@Override
public void onPageSelected(int position) {
new MyAsyncTask().execute();
}
}
然而,正如 Tyczj 在评论中指出的那样,这违背了 ViewPager 试图保持视图加载的目的。此功能旨在使您的应用程序看起来流畅,如果没有它,您的视图将在加载数据时看起来是空的(或呈现其默认外观)。
Tanis 提供的解决方案应该可以工作,但是有人认为应该考虑到这一点。由于AsyncTask
是从 开始的Activity
,因此在处理配置更改时可能会遇到一些问题。也许AsyncTask
直接从片段开始会更有意义。
然后解决方案是让当前显示的片段知道他是现在显示的片段。
首先,您应该在 Activity 中有一个方法,该方法将从以下位置返回当前片段的位置ViewPager
:
public class MainActivity extends Activity{
//....
public int getViewPagerCurrentIndex() {
return pager.getCurrentItem();
}
}
其次,在您的PagerAdapter
ingetItem()
方法中,将当前项目的位置作为参数传递给片段:
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();
}
}