ViewPager设置完FragmentPagerAdapter后动态的进行增加删除Fragment

很多新闻类的App会有增加删除频道功能,也就是在ViewPager中动态的增加删除Fragment。标准的代码为
public class NewsFragmentPagerAdapter extends FragmentPagerAdapter {

    private List<String> mTitles;
    private List<Fragment> mNewsFragmentList;
    private FragmentManager fm;

    public NewsFragmentPagerAdapter(FragmentManager fm, List<String> titles, List<Fragment> newsFragmentList) {
        super(fm);
        this.fm = fm;
        mTitles = titles;
        mNewsFragmentList = newsFragmentList;

    }

    @Override
    public CharSequence getPageTitle(int position) {
        return mTitles.get(position);
    }

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


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

}
这时候增加添加删除fragment的代码
public void addFragment(Fragment fragment, String title){
        mTitles.add(title);
        this.mNewsFragmentList.add(fragment);
        notifyDataSetChanged();
    }

    public void remove(String title){
        int index = mTitles.indexOf(title);
        mTitles.remove(index);
        mNewsFragmentList.remove(index);
        notifyDataSetChanged();
    }
在直接调用addFragment可以成功的添加Fragment。但是调用remove方法并不能移除fragment。viewpager调用setAdapter时会首先执行instantiateItem(ViewGroup container, int position)寻找是否添加过,如果添加过会直接使用,没添加过会执行getItem(int position)。所以当我们仅仅移除列表中的Fragment没生效,因为在adapter已经记录了fragment。再看 instantiateItem(ViewGroup container, int position)方法
@Override
    public Object instantiateItem(ViewGroup container, int position) {
        if (mCurTransaction == null) {
            mCurTransaction = mFragmentManager.beginTransaction();
        }
	// 根据id来匹配fragment
        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;
    }
所以我们重写getItemId(int position)方法,根据fragment的id来查找。
@Override
    public long getItemId(int position) {
        // 获取当前数据的hashCode
        int hashCode = mNewsFragmentList.get(position).hashCode();
        return hashCode;
    }

完美解决问题。

其实是可以直接使用FragmentStatePagerAdapter直接可以达到目的,但是不妥善处理会造成内存泄漏

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值