Как я могу запретить ViewPager делать сетевой запрос, если сетевой запрос уже был сделан для всех страниц
У меня есть просмотрщик с тремя страницами, который использует FragmentStatePagerAdapter. Фрагмент для каждой страницы одинаков, но данные изменяются в зависимости от положения страницы. Логика инфляции для каждого элемента на странице определяется в OnCreateView фрагмента, и поэтому каждый раз, когда создается новый экземпляр фрагмента, сетевые вызовы повторяются, даже если они уже были сделаны при предыдущем посещении этой страницы.
Мой вопрос: как мне это предотвратить? Я новичок в Android, и я знаю, что я что-то здесь упускаю, ЕСЛИ мой подход неверен, пожалуйста, укажите, как я должен предотвратить это поведение.
Некоторый Кодекс: внутри создания деятельности
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] и данные были извлечены, то при повторном посещении той же позиции он не должен совершать новые сетевые вызовы
1 ответ
Вам нужно использовать 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
}
}