关于Viewpager中动态添加一个Fragment的做法

这里写图片描述
比如我现在想在图中红色的后面再添加一个Fragment。

本来我的想法是更改数据源重写刷新适配器,如下

  list_title.add(list_title.size() - 1, times + "");
  list_fragment.add(list_fragment.size() - 1, fragment);
  mAdapter.notifyDataSetChanged();

但是运行后发现报错,报错如下:

    Caused by: java.lang.IllegalStateException: Can't change tag of fragment FaultHandlingRecordsActivityFragment{256f8536 #2 id=0x7f0f0164 android:switcher:2131689828:2}: was android:switcher:2131689828:2 now android:switcher:2131689828:3

感觉是由于添加的时候修改Fragment的tag,翻看了FragmentPagerAdapter的源码中的instantiateItem方法中有一句makeFragmentName(container.getId(), itemId) 是设置tag的。
itemId又是因为 getItemId方法。
final long itemId = getItemId(position);

  @Override
    public Object instantiateItem(ViewGroup container, int position) {
        if (mCurTransaction == null) {
            mCurTransaction = mFragmentManager.beginTransaction();
        }

        final long itemId = getItemId(position);

        // Do we already have this fragment?
        String name = makeFragmentName(container.getId(), itemId);
        Fragment fragment = mFragmentManager.findFragmentByTag(name);
        if (fragment != null) {
            if (DEBUG) Log.v(TAG, "Attaching item #" + itemId + ": f=" + fragment);
            mCurTransaction.attach(fragment);
        } else {
            fragment = getItem(position);
            if (DEBUG) Log.v(TAG, "Adding item #" + itemId + ": f=" + fragment);
            mCurTransaction.add(container.getId(), fragment,
                    makeFragmentName(container.getId(), itemId));
        }
        if (fragment != mCurrentPrimaryItem) {
            fragment.setMenuVisibility(false);
            fragment.setUserVisibleHint(false);
        }

        return fragment;
    }
  public long getItemId(int position) {
        return position;
    }

试着重写getItemId方法保证每次的id都不一样

    @Override
    public long getItemId(int position) {

        return list_fragment.get(position).hashCode();
    }

重新运行了下发现可以添加了,当时内容并没有显示出来。

查看了资料发现,有一个getItemPosition的方法,默认返回如下POSITION_UNCHANGED,表示默认位置的内容没有发生改变。

public int getItemPosition(Object object) {
        return POSITION_UNCHANGED;
    }

还有一个常量POSITION_NONE表示当前的内容不是原有的内容了,提示会重新绘制。我们使用这个。

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

试着运行下果然fragment添加进去了,内容也显示出来了。

总结:


  • 添加数据到数据源的相应位置,并刷新适配器
  list_title.add(list_title.size() - 1, times + "");
  list_fragment.add(list_fragment.size() - 1, fragment);
  mAdapter.notifyDataSetChanged();
  • 重写FragmentPagerAdapter中的方法
 @Override
    public int getItemPosition(Object object) {
        return POSITION_NONE;
    }

    @Override
    public long getItemId(int position) {

        return list_fragment.get(position).hashCode();
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值