Я реализовал 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.
У меня была эта та же проблема, пока я не рассветал на мне, я создавал свой PagerView из другого Фрагмента а не основного вида деятельности.
Мое решение состояло в том, чтобы передать менеджера ChildFragment в конструктора Фрагмента (состояние) PagerAdapter а не менеджер по Фрагменту родительского Фрагмента.
Используя ChildFragmentManager все Фрагменты, созданные ViewPagerAdapter, очищены автоматически, когда родительский Фрагмент уничтожается.