FragmentPagerAdapter неправильно удаляет элементы (фрагменты)

Я реализовал FragmentPagerAdapter и использовал List для хранения всех фрагментов, отображаемых моим ViewPager . В addItem () я просто добавляю созданный фрагмент , а затем вызываю notifyDataSetChanged () . Я не уверен, нужно это или нет.

Моя проблема просто ... начать с фрагмента 1

[Fragment 1] 

добавить новый фрагмент 2

[Fragment 1] [Fragment 2]

удалить фрагмент 2

[Fragment 1]

добавить новый фрагмент 3

[Fragment 1] [Fragment 2]

При добавлении новых фрагментов все выглядит отлично. Как только я удалю фрагмент, а затем добавлю новый экземпляр фрагмента, старый фрагмент все еще отображается. Когда я использую .getClass.getName () , он дает мне имя фрагмента 3, но я все еще вижу фрагмент 2.

Я считаю, что это может быть проблема с instantiateItem () или что-то в этом роде, но я думал, что адаптер должен справиться с этим за нас. Любые предложения были бы замечательными.

код адаптера ...

public class MyPagerAdapter extends FragmentPagerAdapter {
public final ArrayList<Fragment> screens2 = new ArrayList<Fragment>();


private Context context;

public MyPagerAdapter(FragmentManager fm, Context context) {
    super(fm);
    this.context = context;
}

public void removeType(String name){
    for(Fragment f: screens2){
        if(f.getClass().getName().contains(name)){ screens2.remove(f); return; }
    }
    this.notifyDataSetChanged();
}

public boolean addSt(String tag, Class<?> clss, Bundle args){
    if(clss==null) return false;
    if(!clss.getName().contains("St")) return false; 
    if(!args.containsKey("cId")) return false;
    boolean has = false;
    boolean hasAlready = false;
    for(Fragment tab: screens2){
        if(tab.getClass().getName().contains("St")){
            has = true;
            if(tab.getArguments().containsKey("cId"))
                if(tab.getArguments().getLong("cId") == args.getLong("cId")){
                    hasAlready = true;
                }
            if(!hasAlready){
                // exists but is different so replace
                screens2.remove(tab);
                this.addScreen(tag, clss, args, C.PAGE_ST);
                // if returned true then it notifies dataset
                return true;
            }
        }
        hasAlready = false;
    }

    if(!has){ 
        // no st yet exist in adapter
        this.addScreen(tag, clss, args, C.PAGE_ST);
        return true;
    }

    return false;
}

public boolean removeCCreate(){
    this.removeType("Create");  
    return false;
}

@Override
public int getItemPosition(Object object) {

   return POSITION_NONE; //To make notifyDataSetChanged() do something
  }

public void addCCreate(){
    this.removeCCreate();
    Log.w("addding c", " ");
    this.addScreen("Create C",  CreateCFragment.class, null, C.PAGE_CREATE_C);
}

public void addScreen(String tag, Class<?> clss, Bundle args, int type){
    if(clss!=null){
        screens2.add(Fragment.instantiate(context, clss.getName(), args));
    }
}

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


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

}

Я понимаю, что код использует некоторые «гетто» средства определения типа фрагмента, однако я написал этот код исключительно для тестирования функциональности. Любая помощь или идеи были бы замечательными, поскольку кажется, что не так много людей рискнули войти в мир FragmentPagerAdapter s.

43
задан Bugs Happen 27 October 2017 в 16:00
поделиться

1 ответ

У меня была эта та же проблема, пока я не рассветал на мне, я создавал свой PagerView из другого Фрагмента а не основного вида деятельности.

Мое решение состояло в том, чтобы передать менеджера ChildFragment в конструктора Фрагмента (состояние) PagerAdapter а не менеджер по Фрагменту родительского Фрагмента.

Используя ChildFragmentManager все Фрагменты, созданные ViewPagerAdapter, очищены автоматически, когда родительский Фрагмент уничтожается.

0
ответ дан 26 November 2019 в 23:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: