hguser
hguser

Reputation: 36028

Disable fragment reload data in viewpager

I am using ViewPager in my Android project, and I use FragmentStatePagerAdapter to set the pages.

class MyPageAdapter extends FragmentStatePagerAdapter {
    List<Fragment> mList = new ArrayList<>();

    public MyPageAdapter(FragmentManager fm) {
        super(fm);
        this.init();
    }

    private void init() {
        mList.add(new FragmentOne());
        mList.add(new FragmentTwo());
        mList.add(new FragmentThree());
            ....
    }

    @Override
    public Fragment getItem(int position) {
        return mList.get(position);
    }
}

And for each Fragment data will be loaded from the server once the view created, like this:

public  class FragmentOne extends Fragment {
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View v = inflater.inflate(getViewResourceId(), container, false);
        ButterKnife.bind(this, v);
        setRetainInstance(true);

        LinearLayoutManager linearLayoutManager = new LinearLayoutManager(getContext());
        mRecycleView.setLayotManager(linearLayoutManager);

        endlessRecyclerViewScrollListener = new EndlessRecyclerViewScrollListener((LinearLayoutManager) mRecycleView.getLayoutManager()) {
            @Override
            public void onLoadMore(int page, int totalItemsCount, RecyclerView view) {
                loadByPage(page);
            }
        };
        mRecycleView.addOnScrollListener(endlessRecyclerViewScrollListener);
        return v;
    }
    @Override
    public void onActivityCreated(@Nullable Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);

        mAdapter = createAdapter();
        mRecycleView.setAdapter(mAdapter);
        loadByPage(1); // load data from server
    }
}

As shown, the Fragment contains a endless recyclerview.

So far so good. However once I change the selected view page, I found that the data will be reloaded every time. For example, I have scroll 3 pages in FragmentOne, and then change to FragmentTwo, and when I change to FragmentOne back, FragmentOne will try load data of page 1.

Is it possible to avoid this?

Upvotes: 2

Views: 903

Answers (1)

Hamed Karami
Hamed Karami

Reputation: 402

you can do something like this :

private boolean isDataCalled = true;
private List<ItemModel> itemModelList;

and then

 if (isDataCalled){
        loadByPage(1); //  Initialize itemModelList in this method
        setItemAdapter(itemModelList);      
        isDataCalled = false;
    }else {
        setItemAdapter(itemModelList);
    }

setItemAdapter method

private void setItemAdapter(List<ItemModel> itemModelList){
    mAdapter = createAdapter(itemModelList);
    mRecycleView.setAdapter(mAdapter);
}

Upvotes: 1

Related Questions