Android FragmentPagerAdapter无法更改片段

时间:2017-01-21 11:17:09

标签: android android-fragments android-viewpager

我正在开发一个带有动态标签的简单web beowser,以允许用户添加/删除它们。我使用FragmentPagerAdapterViewPagerTabLayout来执行此操作。如果我创建2个选项卡(添加2个片段列表)然后删除第二个选项卡,一切正常,我可以添加另一个片段列表。但是如果我添加2然后删除第一个并尝试将新片段添加到列表中,我会收到异常:

java.lang.IllegalStateException: Can't change tag of fragment Page{162e3786 #1 id=0x7f0d007d android:switcher:2131558525:1}: was android:switcher:2131558525:1 now android:switcher:2131558525:0

我认为这是因为每个片段在FragmentPagerAdapter内都有唯一的ID。 2个片段将具有id 0和1。如果我删除第一个项目(id为0)然后添加新项目(id将为1)。但是id为1的项目已经存在!有没有办法以编程方式更改id或在创建片段时设置id?提前谢谢!

我的FragmentPagerAdapter

public class PagerAdapter extends FragmentPagerAdapter {

    private List<Page> fragments;

    public PagerAdapter(FragmentManager fm, List<Page> pages) {
        super(fm);
        this.fragments = pages;
    }

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

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

    @Override
    public int getItemPosition(Object object) {
        int index = pages.indexOf(object);
        if (index == -1){
            return PagerAdapter.POSITION_NONE;
        } else {
            return index;
        }
    }

    @Override
    public void destroyItem(ViewGroup container, int position, Object object) {
        FragmentManager manager = ((Fragment) object).getFragmentManager();
        FragmentTransaction trans = manager.beginTransaction();
        trans.remove((Fragment) object);
        trans.commit();
    }
}

1 个答案:

答案 0 :(得分:1)

最后,经过一个小时的搜索和尝试后,我找到了解决方案。 要解决此问题,您需要覆盖getItemId() FragmentPagerAdapter方法,其中必须为每个片段返回唯一ID。