首页 > ViewPager用FragmentPagerAdapter做适配器怎么动态删除指定页面?

ViewPager用FragmentPagerAdapter做适配器怎么动态删除指定页面?

如题,我现在有两种实现方法
方法一:已经可以从删除的地方回传删除的Fragment在List中的位置,所以更新适配器中的List,remove掉删除的。然后删除ViewPager缓存中对应的Fragment。再notifyDataSetChanged()

  List<Fragment> fragments = fm.getFragments();
  FragmentTransaction transaction = fm.beginTransaction();
 // mDeleteCityArry是删除的Fragment的位置的数组
  for (int i = 0; i < mDeleteCityArry.length; i++) {
  mFragmentList.remove(mDeleteCityArry[i]);
   //删除相应的缓存碎片。
  transaction.remove(fragments.get(mDeleteCityArry[i]));
  transaction.commit();
  //重新设置适配器中的List
  mAdapter.setList(mFragmentList);
  mAdapter.notifyDataSetChanged();
}

方法二:其实和方法一类似,但是是删除所有ViewPager中缓存的Fragment。再删除mFragmentList中的所有内容,全部重建Fragment,重新设置适配器中的List。一了百了。

   
  mForecasts = mforecastDao.getAllCity();
  forecastSize=mForecasts.size();
  List<Fragment> fragments = fm.getFragments();
  FragmentTransaction transaction = fm.beginTransaction();
   //把所有缓存碎片都删了。
  for (Fragment childFragment : fm.getFragments()) {
            transaction.remove(childFragment);
            transaction.commit();
   }
        //再全部重新创建。
   mFragmentList.clear();
   for (int i = 0; i < forecastSize; i++) {
            mFragmentList.add(OutterFragment.newInstance(mForecasts.get(i).getCity()));
        }
    //重新设置适配器中的List    
   mAdapter.setList(mFragmentList);
   mAdapter.notifyDataSetChanged();     

当然也试过下面这个方法,也没用。


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

总是会在重建Framment的出现空指针错误。应该是这里删除的问题。添加用类似的方法是没问题的。


这个需求我也遇到过,在stackoverflow找到过答案,大概的方法是重写一个PagerAdapter,把View保存在Adapter的私有数组成员里,在需要删除的时候先将ViewPager的Adapter设为null,然后更新View数组(删除指定的View),然后重新设置Adapter。
原问题的回答如下以供参考:android - dynamically add and remove view to viewpager - Stack Overflow


我自己的解决方案,行得通。
这个方法必须要在适配器里面新建碎片。
通过setList重设list里面的内容,再改变tag,再申请刷新。

public class OutterPagerAdapter extends FragmentPagerAdapter {
    private int mSize;
    private List<String> mCitys;
    private long baseId = 0;
    public OutterPagerAdapter(FragmentManager fm,List<String> list) {
        super(fm);
        mCitys=list;
        mSize = list == null ? 0 : list.size();
    }
    @Override
    public int getCount() {
        return mSize;
    }
    //只有通过tag查找碎片的时候没找到,才会调用这个方法。从这个方法里得到fragment然后add进
    //ViewPager中。
    @Override
    public Fragment getItem(int position) {
        return OutterFragment.newInstance(mCitys.get(position));
    }
    //this is called when notifyDataSetChanged() is called
    //重建所有item,新建item的时候会调用instantiateItem。
    @Override
    public int getItemPosition(Object object) {
        // refresh all fragments when data set changed
        return PagerAdapter.POSITION_NONE;
    }
    //每次在instantiateItem中调用这个的时候,都会是不同的id。适配器发现找不到之前的碎片,
    //就会重新调用getItem来新建碎片。
    //这个方法是适配器用来组装tag的一部分。只要改变了它,也就改变了tag。
    @Override
    public long getItemId(int position) {
        // give an ID different from position when position has been changed
        return baseId + position;
    }
    /**
     * 删除之后,在调用notifyDataSetChanged之前,先调用这个notifyChangeInPosition(1)。
     * 改变tag。
     * 
     */
    public void notifyChangeInPosition(int n) {
        // shift the ID returned by getItemId outside the range of all previous fragments
        baseId += getCount() + n;
    }
    // 自己写的一个方法用来添加数据这个可是重点啊
    public void setList(List<String> list) {
        this.mCitys = list;
        mSize = list == null ? 0 : list.size();
    }
}

下面是我参造的来源,那边写的比较详细
http://stackoverflow.com/questions/10396321/remove-fragment-page-from-viewpager-in-android


删除Arraylist中对应的元素,重新设置Adapter,最后记得用fragmentManager remove掉你要删除的fragment

【热门文章】
【热门文章】