1

With the help of Vivek Pratap Singh and astuetz codes from following questions(Remove Fragment Page from ViewPager in Android and Android saving dynamically added viewpager's fragment while coming back from another activity and reopening app), In my previous question in stack overflow I used inbuild method onDestroy, as it looks like it will save all the dynamically added fragments in viewpager.

But it's not happening, I am able to see only one intial static page(i.e. fragment) when I restart my app or navigate to another activity and come back to my activity containing the viewpager with fragments.Could any one please help me on this question.

Here is my source code for your reference:

public class MainActivity extends FragmentActivity implements TextProvider {

private Button mAdd;
private Button mRemove;
private ViewPager mPager;
int position;
private MyPagerAdapter mAdapter;

private ArrayList<String> mEntries = new ArrayList<String>();
@Override
public void onSaveInstanceState(Bundle bundle) {
  super.onSaveInstanceState(bundle);
  bundle.putInt("currenItem", mPager.getCurrentItem());
}

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    mPager = (ViewPager) findViewById(R.id.pager);
    if (savedInstanceState != null) {
        mPager.setCurrentItem(savedInstanceState.getInt("currentItem", 0));
    }
    mEntries.add("page 1");
    mAdd = (Button) findViewById(R.id.add);
    mRemove = (Button) findViewById(R.id.remove);

    mAdd.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View view) {
            addNewItem();
        }
    });

    mRemove.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View view) {
            removeCurrentItem();
        }
    });

    mAdapter = new MyPagerAdapter(this.getSupportFragmentManager(), this);

    mPager.setAdapter(mAdapter);
    mPager.setOffscreenPageLimit(3);

}
private void addNewItem() {
   // int position = mPager.getCurrentItem();

    mEntries.add("page ");

    mAdapter.notifyDataSetChanged();

}

private void removeCurrentItem() {
    int position = mPager.getCurrentItem();
    if(position != 0){
    mEntries.remove(position);
    }else{
        Toast.makeText(getApplicationContext(), "Sorry", Toast.LENGTH_LONG).show();
    }
    mAdapter.notifyDataSetChanged();
}

@Override
public String getTextForPosition(int position) {
    return mEntries.get(position);
}
@Override
public int getCount() {
    return mEntries.size();
}


private class MyPagerAdapter extends FragmentPagerAdapter {

    private TextProvider mProvider;
    private long baseId = 0;

    public MyPagerAdapter(FragmentManager fm, TextProvider provider) {
        super(fm);
        this.mProvider = provider;
    }

    @Override
    public Fragment getItem(int position) {
        switch(position) {
        case 0:
            return FragmentOne.newInstance(mProvider.getTextForPosition(position));
        case 1:
            return FragmentTwo.newInstance(mProvider.getTextForPosition(position));
        case 2:
            return FragmentThree.newInstance(mProvider.getTextForPosition(position));

        default: return FragmentOne.newInstance(mProvider.getTextForPosition(position));
        }



    }

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


    //this is called when notifyDataSetChanged() is called
    @Override
    public int getItemPosition(Object object) {
        // refresh all fragments when data set changed
        return PagerAdapter.POSITION_NONE;
    }


    @Override
    public long getItemId(int position) {
        // give an ID different from position when position has been changed
        return baseId + position;
    }
    @Override
    public void destroyItem(ViewGroup container, int position, Object object) {
    }
    /**
     * Notify that the position of a fragment has been changed.
     * Create a new ID for each position to force recreation of the fragment
     * @param n number of items which have been changed
     */
    public void notifyChangeInPosition(int n) {
        // shift the ID returned by getItemId outside the range of all previous fragments
        baseId += getCount() + n;
    }
}

}

Community
  • 1
  • 1
Adithya
  • 183
  • 1
  • 2
  • 16
  • After a quick look I see that your getItemPosition had an issue. It should not return POSITION_NONE for every position. Returning POSITION_NONE pager will delete the page. Correct it to return the correct position. If the page is no now available then you can return POSITION_NONE. – cgr Nov 30 '15 at 18:52
  • Also if your gets destroyed for any reason then when you come back to it next time it'll have only one fragment of course. If your activity is always alive then your dynamically added fragments will be available. Our else you need to remember the count and type of pages added and recreate them when activity is back. – cgr Nov 30 '15 at 18:57
  • Hi Cgr,Thank you for your quick response.As per your previous comments if I keep position as 1 or 2 or 3 still it will show only one fragment Cgr, my intention is to get all dynamically added fragments in view pager Cgr.Please help. – Adithya Dec 01 '15 at 05:39
  • Also, should I keep 1 or 2 or 3 as position in this method Cgr?, like below. public int getItemPosition(Object object) { // refresh all fragments when data set changed return 2; } – Adithya Dec 01 '15 at 05:45

0 Answers0