如果已经为所有页面发出网络请求,如何阻止viewpager发出网络请求

时间:2015-04-24 23:31:42

标签: android android-fragments android-viewpager android-volley viewpagerindicator

我有一个有三个页面的viewpager使用FragmentStatePagerAdapter。 每个页面的片段相同,但数据会根据页面的位置而变化。页面上每个项目的通胀逻辑都在片段的OnCreateView中定义,这也就是为什么每次片段的新实例被充气时,网络调用都会重复,即使它们已经在之前访问该页面时已经进行过。

我的问题是如何防止这种情况发生。我是android新手,我知道我在这里遗漏了一些东西,如果我的方法有误,请指出我应该如何防止这种行为。

一些代码: 内部活动的oncreate

    ViewPager mViewPager = (ViewPager) findViewById(R.id.vpBooks);
    PagerAdapter mPagerAdapter = new BooksPageAdapter(getSupportFragmentManager(), MainActivity.this, extras);
    mViewPager.setAdapter(mPagerAdapter);

在viewpageradapter中

public BooksPageAdapter(FragmentManager fm, Context context, Bundle extras) {
    super(fm);
    this.extras = extras;
    this.cls = extras.getStringArray("cls");
    this.context = context;
}

@Override
public Fragment getItem(int position) {
    return BooksPageFrag.newInstance(extras, cls[position]);
}

@Override
public int getCount() {
    return cls.length;
}

内部片段:

@Override
public void onCreateView(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    url = getArguments().getString("url");
    urlFare = getArguments().getString("Fare");
    Log.d("url sapf", url);
    queue = Volley.newRequestQueue(this.getActivity());
    getBooks();// HERE network calls are made
}

所以我想要的是如果实例化特定cls [position]的fragement并获取数据然后重新访问相同的位置它不应该进行新的网络调用

1 个答案:

答案 0 :(得分:2)

您需要使用parcelable。我认为你正在使用类对象的列表数组 。执行以下步骤

1。)在类对象中实现parcelable 2.)在OnSavedInstanceState中使用以下代码

 @Override
public void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    outState.putParcelableArrayList("key", mListParcel);
}`

3.)在onCreate方法中使用此代码

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    super.onCreateView(inflater, container, savedInstanceState);
   /*Set Your RecyclerView Stuff here*/
   if(savedInstanceState!=null)
    {
         //Fragment has been loaded earlier\
         mArrayList=savedInstanceState.getParcelableArrayList("key");
         //Use list here
      }
    else
    { 
        //Fragment New 
        // Make Request Here
    }
}