Я реализовал FragmentPagerAdapter
и с помощью List<Fragment>
для хранения всех фрагментов для моего ViewPager
для отображения. В addItem()
я просто добавляю экземпляр Fragment
, а затем вызываю notifyDataSetChanged()
. Я не уверен, что это необходимо или нет.
Моя проблема просто... начать с фрагмента 1
[Fragment 1]
добавить новый фрагмент 2
[Fragment 1] [Fragment 2]
удалить фрагмент 2
[Fragment 1]
добавить новый фрагмент 3
[Fragment 1] [Fragment 2]
При добавлении новых фрагментов все кажется отличным. Как только я удаляю фрагмент, а затем добавляю вновь созданный фрагмент, старый фрагмент все еще отображается. Когда я иду a .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.