Android 替换Viewpager中的片段(notifyDataSetChanged不起作用)

Android 替换Viewpager中的片段(notifyDataSetChanged不起作用),android,android-fragments,android-viewpager,notifydatasetchanged,fragmentstatepageradapter,Android,Android Fragments,Android Viewpager,Notifydatasetchanged,Fragmentstatepageradapter,My Main活动包含一个viewPager 在MainActivity.java中,我为viewpager设置了适配器。适配器扩展FragmentStatePagerAdapter。我要替换的片段是一个 摄影机碎片。因此,当用户单击“切换摄影机”按钮时,我想现在显示摄影机片段,这一次打开了前置摄影机 单击switch Camera按钮,我从传递给自定义适配器的片段的arraylist中删除片段。我添加新片段并调用notifydatasetchanged。但是,这不会导致添加新片段。如何实现vi

My Main活动包含一个viewPager

在MainActivity.java中,我为viewpager设置了适配器。适配器扩展FragmentStatePagerAdapter。我要替换的片段是一个 摄影机碎片。因此,当用户单击“切换摄影机”按钮时,我想现在显示摄影机片段,这一次打开了前置摄影机

单击switch Camera按钮,我从传递给自定义适配器的片段的arraylist中删除片段。我添加新片段并调用notifydatasetchanged。但是,这不会导致添加新片段。如何实现viewpager中片段的动态替换,该viewpager由自定义片段状态寻呼机适配器支持? 代码:

适配器代码:

public class MainViewPagerAdapter extends FragmentStatePagerAdapter {

ArrayList<Fragment> fragmentsArray;

public MainViewPagerAdapter(FragmentManager fm, ArrayList<Fragment> fragmentsArray) {
    super(fm);
    this.fragmentsArray = fragmentsArray;
}

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

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

@Override
public int getItemPosition(Object object) {
    return super.getItemPosition(object);
}
}
public类MainViewPagerAdapter扩展了FragmentStatePagerAdapter{
阵列碎片;
public Main ViewPageRadapter(FragmentManager fm、ArrayList fragmentsArray){
超级(fm);
this.fragmentsArray=fragmentsArray;
}
@凌驾
公共片段getItem(int位置){
返回碎片数组。获取(位置);
}
@凌驾
public int getCount(){
返回fragmentsArray.size();
}
@凌驾
public int getItemPosition(对象){
返回super.getItemPosition(对象);
}
}

您的MainViewPagerAdapter.getItemPosition是问题的原因

默认实现总是返回位置_不变。要使用寻呼机删除片段,您必须为已删除的片段返回PagerAdapter.POSITION\u NONE

此外,您当前的设计与FragmentStatePagerAdapter的理念相矛盾。从FragmentStatePagerAdapter:“当有大量页面时,此版本的寻呼机更有用,工作方式更像列表视图。当页面对用户不可见时,其整个片段可能会被销毁,只保留该片段的保存状态。与FragmentPagerAdapter相比,这允许寻呼机保留与每个访问页面相关的内存少得多,但在页面之间切换时可能会增加开销。”


您当前的实现保存数组中的所有片段,因此破坏了此机制。正确的实现是在MainViewPagerAdapter.getItem方法中创建片段,并让适配器根据需要处理片段生命周期。

多亏了@Okas。我在FragmentStatePager中对getItemPosition做了以下更改适配器子类

@Override
 public int getItemPosition(Object object) {
    if (object instanceof DemoCameraFragment_)
        return POSITION_NONE;
    return super.getItemPosition(object);
}

我在两个片段的OnCreate中都添加了日志,以确认它们是否被重新创建。根据我的要求,只重新创建第二个片段。

发布一些您拥有的代码done@Mano.有没有关于如何更新/替换片段的想法?很明显,我遗漏了一些东西。我不想重置适配器。这看起来像是一个expens手术(如果页面/片段数量增加。此外,我只需要替换一个片段,因此重新实例化其他片段毫无意义。请同时发布MainViewPagerAdapter的代码。@Okas。用MainViewPagerAdapter更新了它。即使我以这种方式实现适配器,如何替换片段?我已经阅读了n getItemPosition的默认实现。我使用FragmentStatePageAdapter的原因是viewpager中的页数很有可能会增加。我仍然不知道在getItemPosition方法中应该做什么来解决我的问题。谢谢。您必须单独跟踪哪个片段您要保留和删除哪个。然后,当某些内容发生更改时,您必须调用notifyDataSetChanged().Pager随后将调用适配器getItemPosition方法。对于要删除的对象,您必须返回POSITION\u NONE,然后Pager将为您删除这些对象。谢谢@Okas。我根据您的帖子进行了更改,并在下面发布了答案。
public class MainViewPagerAdapter extends FragmentStatePagerAdapter {

ArrayList<Fragment> fragmentsArray;

public MainViewPagerAdapter(FragmentManager fm, ArrayList<Fragment> fragmentsArray) {
    super(fm);
    this.fragmentsArray = fragmentsArray;
}

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

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

@Override
public int getItemPosition(Object object) {
    return super.getItemPosition(object);
}
}
@Override
 public int getItemPosition(Object object) {
    if (object instanceof DemoCameraFragment_)
        return POSITION_NONE;
    return super.getItemPosition(object);
}