我有一个有三个页面的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并获取数据然后重新访问相同的位置它不应该进行新的网络调用
答案 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
}
}