gpt4 book ai didi

android - FragmentPagerAdapter 未正确删除项目( fragment )

转载 作者:IT王子 更新时间:2023-10-28 23:54:58 26 4
gpt4 key购买 nike

我已经实现了 FragmentPagerAdapter并使用 List<Fragment>为我的ViewPager 保存所有 fragment 显示。在 addItem()我只是添加一个实例化的 Fragment然后调用notifyDataSetChanged() .我不确定这是否有必要。

我的问题很简单...从 fragment 1 开始

[Fragment 1] 

添加新的 fragment 2

[Fragment 1] [Fragment 2]

删除 fragment 2

[Fragment 1]

添加新的 fragment 3

[Fragment 1] [Fragment 2]

添加新 fragment 时,一切看起来都很棒。一旦我删除一个 fragment ,然后添加一个新实例化的 fragment ,旧 fragment 仍然会显示。当我去 .getClass.getName()它给了我 Fragment 3 的名字,但我仍然看到 Fragment 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);
}

}

我意识到代码使用了一些“贫民窟”方式来确定 fragment 类型,但是我编写这段代码是为了测试功能。任何帮助或想法都会很棒,因为似乎没有多少人冒险进入 FragmentPagerAdapter 的世界。秒。

最佳答案

我遇到了同样的问题,我的解决方案是覆盖方法“destroyItem”,如下所示。

@Override
public void destroyItem(ViewGroup container, int position, Object object) {
FragmentManager manager = ((Fragment)object).getFragmentManager();
FragmentTransaction trans = manager.beginTransaction();
trans.remove((Fragment)object);
trans.commit();
}

这对我有用,有人有其他解决方案吗?

更新:

我发现那些代码使得 Fragment 被删除是不必要的,所以我添加了一个条件来避免它。

@Override
public void destroyItem(ViewGroup container, int position, Object object) {
if (position >= getCount()) {
FragmentManager manager = ((Fragment) object).getFragmentManager();
FragmentTransaction trans = manager.beginTransaction();
trans.remove((Fragment) object);
trans.commit();
}
}

关于android - FragmentPagerAdapter 未正确删除项目( fragment ),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9061325/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com