【问题标题】:Remove or Clear All Fragments From ViewPager从 ViewPager 中删除或清除所有片段
【发布时间】:2020-07-15 03:59:12
【问题描述】:

我正在通过类似这样的片段填充视图寻呼机

pagerAdapter = new PagerAdapter(getSupportFragmentManager());
        mViewPager = (ViewPager) findViewById(R.id.container);

        for (int i = 0; i < 10; i++) {
            newfragment fragobj = new newfragment();
            fragobj.setArguments(bundle);
            pagerAdapter.addFragment(fragobj, "Category");
        }

            mViewPager.setAdapter(pagerAdapter);
            mViewPager.setCurrentItem(page);

我想清除所有碎片并在清除后添加新的碎片。如果我现在添加新片段,它会使用旧片段进行广告。

我尝试了许多堆栈溢出答案,但没有一个对我有用。

【问题讨论】:

    标签: android android-fragments android-viewpager android-pageradapter


    【解决方案1】:

    片段已经被移除和销毁。问题在于浏览量。

    只有这个对我有用

    myViewPager.setSaveFromParentEnabled(false);
    

    干杯!

    【讨论】:

    • 也为我工作!非常感谢
    【解决方案2】:

    在 ViewPagerAdapter 中添加这个方法,当你想从 viewPager 中清除 Fragment 时调用它

    public void clear() {
        FragmentTransaction transaction = manager.beginTransaction();
        for (Fragment fragment : mFragmentList) {
            transaction.remove(fragment);
        }
        mFragmentList.clear();
        transaction.commitAllowingStateLoss();
    }
    

    【讨论】:

      【解决方案3】:

      mViewPager : 是你用来设置 Fragment 的视图

      mViewPager = (YourViewPager) findViewById(R.id.myPager);
      

      TABLE : 只是我所有片段位置的整数列表

      public void destroyAllItem() {
              int mPosition = mViewPager.getCurrentItem();
              int mPositionMax = mViewPager.getCurrentItem()+1;
              if (TABLE.size() > 0 && mPosition < TABLE.size()) {
                  if (mPosition > 0) {
                      mPosition--;
                  }
      
                  for (int i = mPosition; i < mPositionMax; i++) {
                      try {
                          Object objectobject = this.instantiateItem(mViewPager, TABLE.get(i).intValue());
                          if (objectobject != null)
                              destroyItem(mViewPager, TABLE.get(i).intValue(), objectobject);
                      } catch (Exception e) {
                          Log.i(TAG, "no more Fragment in FragmentPagerAdapter");
                      }
                  }
              }
          }
      
          @Override
          public void destroyItem(ViewGroup container, int position, Object object) {
              super.destroyItem(container, position, object);
      
              if (position <= getCount()) {
                  FragmentManager manager = ((Fragment) object).getFragmentManager();
                  FragmentTransaction trans = manager.beginTransaction();
                  trans.remove((Fragment) object);
                  trans.commit();
              }
          }
      

      【讨论】:

      • 我不是专家,所以请您告诉我有关该 TABLE 变量的更多信息以及如何创建它。
      • TABLE.size() 是 viewpager 中的片段数。您可以从 viewpager 适配器获取片段数
      【解决方案4】:

      使用ViewPager2 (1.0.0) 和FragmentStateAdapter 我还发现使用notifyDataSetChanged 更新数据集后不会重新创建当前视图,即使当前视图对应的数据发生更改也是如此。显然,notifyDataSetChanged 没有对已更改的内容进行非常彻底的调查,并假定当前视图仍然正确。

      我发现的解决方法是再次设置我已经为之前的数据集设置的相同适配器:

      viewPager2.setAdapter(myFragmentStateAdapter);
      

      显然,设置一个适配器会刷新缓存的视图,这当然很有意义。幸运的是,它不会检查它是否是同一个适配器。

      【讨论】:

        猜你喜欢
        • 2021-10-31
        • 1970-01-01
        • 2013-05-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多