0

作为 viewpager 预加载其中使用的片段的 +1 和 -1。我使用 asyntask 加载数据,我希望仅在页面本身时执行。

我应该在哪里执行该功能?oncreate 似乎对我不起作用

4

2 回答 2

2

您可以ViewPager.OnPageChangeListeneronPageSelected().

例如:

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

然而,正如 Tyczj 在评论中指出的那样,这违背了 ViewPager 试图保持视图加载的目的。此功能旨在使您的应用程序看起来流畅,如果没有它,您的视图将在加载数据时看起来是空的(或呈现其默认外观)。

于 2013-06-19T20:16:33.123 回答
1

Tanis 提供的解决方案应该可以工作,但是有人认为应该考虑到这一点。由于AsyncTask是从 开始的Activity,因此在处理配置更改时可能会遇到一些问题。也许AsyncTask直接从片段开始会更有意义。

然后解决方案是让当前显示的片段知道他是现在显示的片段。

首先,您应该在 Activity 中有一个方法,该方法将从以下位置返回当前片段的位置ViewPager

public class MainActivity extends Activity{

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

其次,在您的PagerAdapteringetItem()方法中,将当前项目的位置作为参数传递给片段:

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();
   }
}
于 2013-06-19T20:43:13.523 回答