0

My ViewPager will delete a fragment upon button click. But when I click delete, I get "canot change tag" error. Browsing through other similar questions, it was either a problem with the getItem, or getCount in the PagerAdapter, which I think my implementation is fine. Please advice.

This is the fragment to be deleted

@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);
    displayActivity = (DisplayActivity) getActivity();
    initView();
}
 Button delete = (Button) getActivity().findViewById(R.id.dont_show_button_1);
    delete.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            displayActivity.removeCurrentFragment(count-1);
        }
    });

My PagerAdapter is

public class PagerAdapter extends FragmentPagerAdapter {

long baseId = 0;
public static List<Fragment> fragmentArrayList = new ArrayList<Fragment>();

public PagerAdapter(FragmentManager fm){
    super(fm);
    fragmentArrayList.add(new FragmentOne());
    fragmentArrayList.add(new FragmentTwo());
    fragmentArrayList.add(new FragmentThree());
}
@Override
public Fragment getItem(int position) {
    return fragmentArrayList.get(position);
}

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

@Override
public int getItemPosition(Object object){
    return PagerAdapter.POSITION_NONE;
}

@Override
public long getItemId(int position) {
    // give an ID different from position when position has been changed
    return baseId + position;
}

/**
 * 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;
}
}

This is the activity that hosts the ViewPager

public class DisplayActivity extends FragmentActivity {

ViewPager viewPager;
PagerAdapter pagerAdapter;
String TAG = "DisplayActivity";

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.db_layout);

    viewPager = (ViewPager) findViewById(R.id.pager);

    pagerAdapter = new PagerAdapter(getSupportFragmentManager());
    viewPager.setAdapter(pagerAdapter);
}

public void removeCurrentFragment(int position){
    pagerAdapter.fragmentArrayList.remove(position);
    pagerAdapter.notifyChangeInPosition(1);
    pagerAdapter.notifyDataSetChanged();
    Log.e(TAG, "in removeCurrentFragment");
}

I'm getting the error:

IllegalStateException: Can't change tag of fragment FragmentTwo{170c98f1 #1 id=0x7f0c006d android:switcher:2131492973:1}: was android:switcher:2131492973:1 now android:switcher:2131492973:3
Jasmine Rain
  • 419
  • 2
  • 6
  • 17

2 Answers2

1

The problem was with

public class PagerAdapter extends FragmentPagerAdapter

Changing it to

public class PagerAdapter extends FragmentStatePagerAdapter

enabled correct deletion.

This can be attributed to "FragmentStatePagerAdapter disposes of views that fall outside the current and traversable views." As suggested to this post Remove Fragment Page from ViewPager in Android

Community
  • 1
  • 1
Jasmine Rain
  • 419
  • 2
  • 6
  • 17
0

By Looking at your code i think your count value may be wrong.

Button delete = (Button) getActivity().findViewById(R.id.dont_show_button_1);
delete.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
       // here
        displayActivity.removeCurrentFragment(count-1);
        //change to
      displayActivity.removeCurrentFragment(adapter.getCount()-1);
    }
}); 

Hope it helps.Please post your whole code like where you getting the value of count variable. Post whole Code if Solution Does not Solve Your Problem . Refer here for example:- https://androidruler.wordpress.com/2016/02/22/working-with-viewpager-as-a-images-slider/

Jagjit Singh
  • 1,909
  • 1
  • 14
  • 19