从 ViewPager 中删除由 FragmentStatePagerAdapter 填充的所有片段

2024-04-18

我有一个 ViewPager,我使用 FragmentStatePagerAdapter 填充片段(代表 arrayListOfObjects 中的对象)。 一切正常:

            mMyFragmentPagerAdapter = new fragmentAdapter(getSupportFragmentManager(),orientation
            ,rePopulatedfireInfoList);
        mPager = (ViewPager)findViewById(R.id.fireInfoFragment_container);
        initButton();
        setTab();
        mPager.setAdapter(mMyFragmentPagerAdapter); 

片段适配器扩展了 FragmentStatePagerAdapter。

从主要活动中,我启动了一个对话主题活动;用户可以添加一个新的收藏夹位置,创建一个新对象,该对象会更改主要活动传递的对象的数组列表。 这是启动对话框活动的代码;一切正常:

        Intent locationIntent = new Intent(afisController.this, locationActivity.class);
    locationIntent.putExtra("firesList", new fireInfoListWrapper(arrayListOfObjects));
    startActivityForResult(locationIntent,1);

浮动活动将对象添加到 arrayListOfObjects 中。

在主要活动的 onActivityResult 上,我将收到的 arraListOfObjects 与发送的进行比较;如果不同,我想完全删除 viewPager 的内容并使用新的 arrayListOfObjects 重新创建它。这是 onActivityResults:

     protected void onActivityResult(int requestCode, int resultCode,
            Intent data) {
 Toast.makeText(this, "Activity Results fired..." , 1500 ).show();
            if ((resultCode == 0) && (data != null)) { 
                Log.i("onActvityResult", "Inside resultCode check");   
                Bundle b = data.getExtras();
                if(b != null){
                    Log.i("onActvityResult", "not null");
                    returnedFireInfoList = (ArrayList<fireInfo>) data.getSerializableExtra("firesListResult"); 
                    Log.i("onActvityResult", "results Size: "+returnedFireInfoList.size());
                    if(returnedFireInfoList.size()>0){
                        Log.i("onActvityResult", "locationName: "+returnedFireInfoList.get(0).getLocationName());
                        //compare returnedFireInfoList and rePopulatedfireInfoList, if different; 
                        //add difference to rePopulatedfireInfoList and write back to file.
                        updateFireInfos(returnedFireInfoList, rePopulatedfireInfoList);
        if(returnedFireInfoList.size()!=rePopulatedfireInfoList.size()){
mMyFragmentPagerAdapter1 = new fragmentAdapter(getSupportFragmentManager(),orientation
                    ,returnedFireInfoList);
            mPager = (ViewPager)findViewById(R.id.fireInfoFragment_container); 
            Log.i("updateFireInfos", "fragmentsCount is"+mPager.getCurrentItem());
            fireInfoFragment fragment = 
                      (fireInfoFragment) getSupportFragmentManager().findFragmentById(R.id.fireInfoFragment_container);
//This is where the problem is, I don't want to remember what was already on the viewPager //called mPager before.
           //   mPager.removeAllViews();
            //mPager.setAdapter(null);
            mMyFragmentPagerAdapter1.notifyDataSetChanged();            
            mPager.setAdapter(mMyFragmentPagerAdapter1);               mMyFragmentPagerAdapter1.notifyDataSetChanged();                     
                    }                   
                }
            }        

这是fragmentStateAdapter代码:

public class fragmentAdapter extends FragmentStatePagerAdapter {

private FragmentManager fragmentManager;
 private FragmentTransaction mCurTransaction = null;
 private ArrayList<Fragment.SavedState> mSavedState = new ArrayList<Fragment.SavedState>();
 private ArrayList<Fragment> mFragments = new ArrayList<Fragment>();
 private Fragment mCurrentPrimaryItem = null;



public void restoreState(Parcelable state, ClassLoader loader) {
    //Need to only delete info from marked fragments (theoned that are stored on orientationchange
    //Currently redoing the entire call; resulting in delay due to server call
    //if(isLastOrientationPortrait != isPortrait){
    if(state != null){
        Bundle bundle1 = (Bundle) state;
        bundle1.setClassLoader(loader);
        Iterable<String> keys = bundle1.keySet();
        Log.i("restoreState", "containsKey FragmentStatePagerAdapter: "+keys);
        //android.support.v4.app.FragmentManager fragmentManager= fragmentAdapter.this.fragmentManager;
        android.support.v4.app.FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); 
        //if (fragmentTransaction == null) {
        //  Log.i("restoreState", "fragmentTransactionTest");

            fragmentTransaction = fragmentManager.beginTransaction();
       // }
        for (String key : keys) {
            if (key.startsWith("f")) {
                Fragment f = fragmentManager.getFragment(bundle1,
                        key);
                fragmentTransaction.remove(f);
                fragmentTransaction.commit();
            }
            }
        }
    //}       
    }


@Override
public int getItemPosition(Object object) {
    // TODO Auto-generated method stub
    //return super.getItemPosition(object);
    return fragmentAdapter.POSITION_NONE;
}


public fragmentAdapter(android.support.v4.app.FragmentManager fragmentManager,String orientation,
         ArrayList<fireInfo> fireInfoList) {
     super(fragmentManager);
     this.orientation = orientation;
     this.fireInfoList = fireInfoList;
     this.numItems = fireInfoList.size();
     this.fragmentManager=fragmentManager;
 }
 ArrayList<fireInfo> fireInfoList;
 String orientation;
 int numItems;


@Override
 public int getCount() {
     Log.i("numItems", "is: "+fireInfoList.size());
     return numItems;
 }

@Override
public Fragment getItem(int arg0) {
    Log.i("fragmentAdapterIndex", "is: "+arg0);
    return fireInfoFragment.newInstance(orientation, fireInfoList.get(arg0));
}    

}

Problem:但在我触发 startActivityFor 结果之前,新的 ArrayListOfObjects 已与旧的一起添加。

如何强制 viewPager 忘记旧内容?基本上使用我的fragmentStateAdapter 用这个newArrayListofObjects 重置viewPager 适配器?


我想问题在于旧碎片仍然驻留在FragmentManager您用于适配器。如果是这种情况,您所要做的就是从片段管理器中删除所有旧片段。

所以基本上只需在适配器的构造函数中执行以下代码:

public fragmentAdapter(FragmentManager fragmentManager, String orientation, ArrayList<fireInfo> list) {
    super(fragmentManager);
    if (fragmentManager.getFragments() != null) {
        fragmentManager.getFragments().clear();
    }
    //... your other code here
}

这行代码是不必要的:

mMyFragmentPagerAdapter1.notifyDataSetChanged();     

EDIT:使用删除片段可能更正确FragmentTransaction:

    List<Fragment> fragments = fragmentManager.getFragments();
    if (fragments != null) {
        FragmentTransaction ft = fragmentManager.beginTransaction();
        for (Fragment f : fragments) {
            //You can perform additional check to remove some (not all) fragments:
            if (f instanceof AddedByCurrentPagerAdapterFragment) { 
                ft.remove(f);
            }
        }
        ft.commitAllowingStateLoss();
    }

这将需要一些时间FragmentTransaction(异步)执行。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从 ViewPager 中删除由 FragmentStatePagerAdapter 填充的所有片段 的相关文章

  • 通过数据绑定将字符串传递到包含的布局不起作用

    我正在尝试使用 Android 数据绑定功能将一个简单的字符串从我的主布局传递到布局 它编译得很好 但传递给包含的值实际上并未传递 即 它没有出现在我的布局中
  • 在 Android 中创建和使用 9 补丁图像

    我最近听说了 9 补丁图像 我知道它是 9 平铺的并且是可拉伸的 我想了解更多 如何创建 9 块图像 有什么工具吗 我可以通过 AndroidSDK 或代码创建它吗 9 patch 相对于普通 png 的主要优点 它是否可以根据屏幕动态 自
  • 关闭 Android 中的飞行模式

    如果 num gt 50 我想关闭飞行模式 我实现了这段代码 来自在 Android 中切换飞行模式 https stackoverflow com questions 5533881 toggle airplane mode in and
  • 是否可以使用最新的 APP_PLATFORM,同时仍保持向后兼容性?

    这是我的 Application mk APP ABI armeabi v7a APP PLATFORM android 16 APP OPTIM release APP STL gnustl static APP CPPFLAGS std
  • AppCompat v21 工具栏更改徽标大小

    我正在从以前的操作栏迁移到 appcompat v21 中的新工具栏功能 我仍然想将徽标保留在操作栏 工具栏 的左上角 为此 我在布局中添加了支持工具栏 并为其创建了一个新的工具栏 app theme style NewToolBarSty
  • Google Firebase - 如何删除崩溃报告?

    我最终失明了吗 还是没有明显的方法可以通过 Google Firebase Web 控制台删除 Firebase 崩溃报告 我的 Android 应用程序已成功记录报告 但现在出现大量 开发崩溃 占用了我在控制台中的大部分视图 这使得找到实
  • 按钮未显示在屏幕上

    我创建了一个应用程序 其中显示带有图像和文本的列表视图 我在页面末尾添加按钮 但这没有显示在屏幕上 我是 Android 新手 我该如何解决这个问题 这是我的 UI XML 代码
  • 如何将画廊意图中的“打开”更改为“完成”?

    我使用以下意图打开画廊来选择多个图像和视频 Intent intent new Intent intent setType image video intent putExtra Intent EXTRA ALLOW MULTIPLE tr
  • 访问角落里的存储

    我能找到的与文件存储有关的最接近文档的是这个帖子 http nookdeveloper zendesk com entries 20257971 updated what are the size constraints on my app
  • Android - 当不在栏顶部时推送通知空白

    我在使用 Android 推送通知时遇到一个小问题 如果有 3 个通知 并且只有其中一个显示标题和消息 位于酒吧顶部的那个 如果有人知道可能是什么问题 请告诉我 请参阅此链接上的图像 这就是我接收通知的方式http postimg org
  • 如何在 Firebase 远程配置中从 JSON 获取值

    我是 Android 应用开发和 Firebase 的新手 我想知道如何获取存储在 Firebase 远程配置中的 JSONArray 文件中的值 String 和 Int 我使用 Firebase Remote Config 的最终目标是
  • 使用 Android 播放任意音调

    有没有办法让Android发出任意频率的声音 意思是 我不想预先录制声音文件 我环顾四周 音调发生器 http developer android com reference android media ToneGenerator html
  • Android中不同线程的数据库访问

    我有一个在 AsyncTasks 中从互联网下载数据的服务 它解析数据并将其存储在数据库中 该服务持续运行 当服务写入数据库时 活动会尝试从数据库中读取更改 我有一个数据库助手 有多种写入和读取方法 这会导致问题吗 可能尝试从两个不同的线程
  • 从多个选项卡中的编辑文本字段获取文本

    我正在尝试创建一个使用选项卡作为输入表单的 Android 应用程序 基本上 我希望对其进行设置 以便用户可以在一个选项卡上输入一些信息 然后提交该信息 或者转到另一个选项卡并输入更多信息 然后从两个选项卡提交信息 我正在使用操作栏和片段来
  • 如何从android获取应用程序安装时间

    我尝试了一些方法 但没有成功 请帮助我 PackageManager pm context getPackageManager ApplicationInfo appInfo pm getApplicationInfo app packag
  • Integer.parseInt("0x1F60A") 以 NumberformatException 结束

    我尝试从数据库中获取长字符串内的表情符号代码 格式如下 0x1F60A 所以我可以访问代码 但它将是String 起初 我尝试通过执行以下操作来转换变量tv setText beforeEmo getEmijoByUnicode int e
  • 如何在Android Compose中使用otf类型字体文件?

    我正在学习使用 Android Jetpack Compose 现在我有一个正则 otf字体文件在资产 字体 我想在文本中使用它 java lang RuntimeException Font asset not found commonu
  • 在 Android 中上传文件出现内存不足错误

    我的上传代码如下 String end r n String twoHyphens String boundary try URL url new URL ActionUrl HttpURLConnection con HttpURLCon
  • 如何以编程方式创建活动转换?

    我想以编程方式创建一个动画 以从触摸屏点启动具有缩放效果的活动 接下来我模拟缩放输入效果
  • putFragment() - 片段 x 当前不在 FragmentManager 中

    上面的标题被问了很多次 但答案似乎与FragmentStatePagerAdapter这与我的问题无关 我正在使用该方法putFragment Bundle String Fragment 直接地 The 安卓文档 http develop

随机推荐

  • 装箱(或背包?)问题

    我收集了 43 到 50 个数字 范围从 0 133 到 0 005 但大部分都比较小 如果可能的话 我想找到 L 和 R 之和非常接近的所有组合 The brute force method takes 243 to 250 steps
  • UrlHelper.Action("Edit", "Ad") 返回 id 参数?

    Hi 我使用以下代码生成 URL UrlHelper urlHelper new UrlHelper htmlHelper ViewContext RequestContext urlHelper Action Edit Ad 如果我当前在
  • 如何重置爬虫URL缓存?

    我正在运行一个通过expressjs 调用调用的爬虫 当我再次调用相同的路线时 我的爬虫再次运行 但显示所有路线已经完成 我什至删除了 storage 文件夹 我阅读了文档 但似乎无法让 purgeDefaultStorages 工作 我将
  • Oracle数据库中如何去掉NUL字符?

    数据库 我有一个 Oracle11g 数据库 其中有一个包含大约 1000 万行和大约 40 列的表 这些数据源自打孔卡时代 并已从一个 Oracle 版本转换到下一个版本多次 这是一个实时生产数据库 并且在某种程度上持续使用 但它并不是那
  • 与 NaN 进行元素比较作为相等

    如果我运行以下代码 dft1 pd DataFrame a 1 np nan np nan dft2 pd DataFrame a 1 1 np nan dft1 a dft2 a 结果是 0 True 1 False 2 False Na
  • Android 上的位置感知地理编码(就像 Google 地图)

    似乎在搜索谷歌地图 app is 位置感知 例如 如果我在悉尼搜索 Pitt St 它会立即找到正确的街道 单击 您的意思是 会显示其他 Pitt St 的列表附近郊区 有没有办法在我们的应用程序中获得类似的体验 我尝试了标准Geocode
  • 将 float 发送到不兼容类型 id 的参数

    我正在创建一个按钮 该按钮使用核心数据来保存点注释的名称 x 坐标和 y 坐标 我可以成功保留该名称 但当我尝试保存坐标时 我不断收到此错误 我已经记录了正确的数据 但我似乎无法保存它 当我尝试为 newPOI 设置值时 收到一条错误消息
  • AWS Cognito - 管理员无需发送电子邮件即可重置用户密码

    我需要重置一些用户的密码 但是not发送忘记密码的电子邮件 只需重置密码 以便他们下次登录时我可以显示一条消息 要求他们请求重置密码 深入研究我需要的最基本的东西 在不通知用户的情况下 我需要让他们进入一个RESET REQUIRED状态
  • C++ std::pair 的 C# 模拟是什么?

    我感兴趣的是 C 的类似物是什么std pair在 C 中 我发现System Web UI Pair类 但我更喜欢基于模板的东西 谢谢你 Tuples 自 NET4 0起可用 http msdn microsoft com en us l
  • 具有纬度/经度值的 Android GeoPoint

    我正在尝试获取 23 4456 by 45 44334 的 GeoPoint 我应该将什么值传递到 GeoPoint 的构造函数中 因为它只接受整数 GeoPoint 坐标以微度为单位 度 1e6 书面形式here http develop
  • 尝试让 div 在鼠标移动时“跟随”光标,但有延迟

    我想创建类似于旧鼠标轨迹的效果 其中 div 被延迟但跟随光标 通过使用设置间隔来触发光标坐标的动画 我已经相当接近了 body mousemove function e if enableHandler handleMouseMove e
  • 使用来自 WebSocket @ServerEndpoint 的 CDI @SessionScoped bean

    在 Web 应用程序中 用户使用 servlet HTTP 会话 一些数据存储在 CDI SessionScoped beans 中 稍后在某些页面中 WebSocket 通信是在用户浏览器和服务器之间执行的 对于 GlassFish 4
  • 如何从云函数内部运行查询?

    我想在调用 Firebase 应用程序上的云函数后对数据库执行查询 假设我在数据库上有某个触发器 请考虑中提供的示例Firebase 入门指南 https firebase google com docs functions write f
  • Ruby:在类方法中使用模块方法

    我们如何在类方法中使用模块方法而不扩展模块 module TestModule def module method module end end class TestClass include TestModule def self tes
  • gdb 输入文件中的十六进制值

    我正在尝试通过使用 gdb 内的 run 我可以成功地溢出程序 但在将十六进制值附加到字符串时遇到问题 我尝试过引用 将 mem addr 的值转换为 ascii 以及各种转义尝试 但没有成功 输入文件示例 AAAA x42 在上面的示例中
  • 监控 REST API 的最佳方式是什么? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我创建了一个基于 RESTful 模式的 API 我想知道监视它的最佳方法是什么 我可以以某种方式收集每个请求的统计信息以及我可以监控
  • jsfiddle问题[重复]

    这个问题在这里已经有答案了 我无法让这个极其简单的 jsfiddle 工作 它只是应该在单击按钮时提醒测试 我在这里缺少什么 http jsfiddle net u9nG6 2 http jsfiddle net u9nG6 2 您必须将加
  • CSS 滤色器叠加

    我正在尝试在图像上创建颜色叠加层 就像在这个应用程序中一样 图像上的绿色叠加层 https i stack imgur com FdgdA png https i stack imgur com FdgdA png 对我来说 他们看起来并不
  • Word 2007 VBA:ActiveDocument.CustomXMLParts

    In 本教程 https learn microsoft com en us archive blogs erikaehrli data driven document generation with word 2007 and the o
  • 从 ViewPager 中删除由 FragmentStatePagerAdapter 填充的所有片段

    我有一个 ViewPager 我使用 FragmentStatePagerAdapter 填充片段 代表 arrayListOfObjects 中的对象 一切正常 mMyFragmentPagerAdapter new fragmentAd