Как я могу запретить 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
    }
}
Другие вопросы по тегам