Java 如何使viewpager不再加载已加载的页面

Java 如何使viewpager不再加载已加载的页面,java,android,android-fragments,android-viewpager,fragmentpageradapter,Java,Android,Android Fragments,Android Viewpager,Fragmentpageradapter,我有7个标签的Viewpager,就像在play store中,如果我们点击主屏幕上的标签,它会加载,如果我们再点击那个标签,它不会加载,我想如果我点击标签1,它应该加载,然后我让点击标签7,然后我再点击标签1,它不应该加载,只有在满足某些条件时才加载,我怎么做?现在,它只是一个带有适配器的简单视图寻呼机,如: public class PagerNewProductAdapter extends FragmentStatePagerAdapter { RealmList<

我有7个标签的Viewpager,就像在play store中,如果我们点击主屏幕上的标签,它会加载,如果我们再点击那个标签,它不会加载,我想如果我点击标签1,它应该加载,然后我让点击标签7,然后我再点击标签1,它不应该加载,只有在满足某些条件时才加载,我怎么做?现在,它只是一个带有适配器的简单视图寻呼机,如:

  public class PagerNewProductAdapter extends FragmentStatePagerAdapter { 
      RealmList<SubCategory> categoryData;
      String categoryName;
      String categoryId;
      Env env;

      public PagerNewProductAdapter(Fragment fragment, RealmList<SubCategory> category, String categoryName, String categoryId, Env env) {
        super(fragment.getChildFragmentManager());
        categoryData = category;
        this.categoryId = categoryId;
        this.env = env;
        this.categoryName = categoryName;
      }

      @Override
      public int getCount() {
        return categoryData.size() + 2;
      }

      @Override
      public Fragment getItem(int position) {
        Fragment fragment;
        if (position == 0) {
          fragment= ProductFragment.newInstance("2", categoryId, categoryName);
        } else if (position == 1) {
          fragment= ProductFragment.newInstance("3", categoryId, categoryName);
        } else {
          fragment= ProductFragment.newInstance("1", categoryData.get(position - 2).getCategoryId(), categoryName);
        }
        return fragment;
      }

      @Override
      public CharSequence getPageTitle(int position) {
        if (position == 0) {
          // return env.appSubcategoryViewAll;
          return env.appSubcategoryViewAll;
        } else if (position == 1) {
          return env.appDashboardCBrands;
        } else {
          return categoryData.get(position - 2).getName();
        }
     }
  }
公共类PagerNewProductAdapter扩展了FragmentStatePagerAdapter{
RealmList分类数据;
字符串类别名称;
字符串类别;
环境环境;
公共PagerNewProductAdapter(片段片段、RealmList类别、字符串categoryName、字符串categoryId、环境环境){
super(fragment.getChildFragmentManager());
类别数据=类别;
this.categoryId=categoryId;
this.env=env;
this.categoryName=categoryName;
}
@凌驾
public int getCount(){
返回categoryData.size()+2;
}
@凌驾
公共片段getItem(int位置){
片段;
如果(位置==0){
fragment=ProductFragment.newInstance(“2”,categoryId,categoryName);
}否则如果(位置==1){
fragment=ProductFragment.newInstance(“3”,categoryId,categoryName);
}否则{
fragment=ProductFragment.newInstance(“1”,categoryData.get(位置-2).getCategoryId(),categoryName);
}
返回片段;
}
@凌驾
公共字符序列getPageTitle(int位置){
如果(位置==0){
//返回env.appsubcategorityviewall;
返回env.appsubcategorityviewall;
}否则如果(位置==1){
返回env.appDashboardCBrands;
}否则{
返回categoryData.get(位置-2).getName();
}
}
}

谢谢

我想在这种情况下你可以使用
SparseArray

public class PagerNewProductAdapter extends FragmentStatePagerAdapter {
  private final SparseArray<Fragment> registeredFragments = new SparseArray<>();
  RealmList<SubCategory> categoryData;
  String categoryName;
  String categoryId;
  Env env;

  public PagerNewProductAdapter(Fragment fragment, RealmList<SubCategory> category, String categoryName, String categoryId, Env env) {
    super(fragment.getChildFragmentManager());
    categoryData = category;
    this.categoryId = categoryId;
    this.env = env;
    this.categoryName = categoryName;
  }

  @NonNull
  @Override
  public Object instantiateItem(ViewGroup container, int position) {
    if (registeredFragments.get(position) == null) {
      Object fragment = super.instantiateItem(container, position);
      registeredFragments.put(position, (BaseFragment) fragment);
      return fragment;
    } else {
      return registeredFragments.get(position);
    }
  }

  @Override
  public void destroyItem(ViewGroup container, int position, Object object) {
    super.destroyItem(container, position, object);
    registeredFragments.remove(position);
  }

  @Override
  public Fragment getItem(int position) {
    Fragment fragment;
    if (position == 0) {
        fragment= ProductFragment.newInstance("2", categoryId, categoryName);
    } else if (position == 1) {
        fragment= ProductFragment.newInstance("3", categoryId, categoryName);
    } else {
        fragment= ProductFragment.newInstance("1", categoryData.get(position - 2).getCategoryId(), categoryName);
    }
    return fragment;
  }

  @Override
  public int getCount() {
    return categoryData.size() + 2;
  }



  @Override
  public CharSequence getPageTitle(int position) {
    if (position == 0) {
       // return env.appSubcategoryViewAll;
        return env.appSubcategoryViewAll;
    } else if (position == 1) {
        return env.appDashboardCBrands;
    } else {
        return categoryData.get(position - 2).getName();
    }
  }
}
公共类PagerNewProductAdapter扩展了FragmentStatePagerAdapter{
专用最终SparseArray registeredFragments=新SparseArray();
RealmList分类数据;
字符串类别名称;
字符串类别;
环境环境;
公共PagerNewProductAdapter(片段片段、RealmList类别、字符串categoryName、字符串categoryId、环境环境){
super(fragment.getChildFragmentManager());
类别数据=类别;
this.categoryId=categoryId;
this.env=env;
this.categoryName=categoryName;
}
@非空
@凌驾
公共对象实例化项(视图组容器,int位置){
if(registeredFragments.get(position)==null){
Object fragment=super.instanceItem(容器、位置);
放置(位置,(基本片段)片段);
返回片段;
}否则{
返回registeredFragments.get(位置);
}
}
@凌驾
公共项(视图组容器、int位置、对象){
超级项目(容器、位置、对象);
注册碎片。移除(位置);
}
@凌驾
公共片段getItem(int位置){
片段;
如果(位置==0){
fragment=ProductFragment.newInstance(“2”,categoryId,categoryName);
}否则如果(位置==1){
fragment=ProductFragment.newInstance(“3”,categoryId,categoryName);
}否则{
fragment=ProductFragment.newInstance(“1”,categoryData.get(位置-2).getCategoryId(),categoryName);
}
返回片段;
}
@凌驾
public int getCount(){
返回categoryData.size()+2;
}
@凌驾
公共字符序列getPageTitle(int位置){
如果(位置==0){
//返回env.appsubcategorityviewall;
返回env.appsubcategorityviewall;
}否则如果(位置==1){
返回env.appDashboardCBrands;
}否则{
返回categoryData.get(位置-2).getName();
}
}
}

您可以将先前创建的片段存储在数组中。这确保了我们将使用先前创建的实例(如果它存在于我们的数组中)

public class PagerNewProductAdapter extends FragmentStatePagerAdapter { 
      Fragment[] cache;
      RealmList<SubCategory> categoryData;
      ...

      public PagerNewProductAdapter(Fragment fragment, RealmList<SubCategory> category, String categoryName, String categoryId, Env env) {
        ...
        this.categoryName = categoryName;
        this.cache = new Fragment[getCount()];
      }

      @Override
      public int getCount() {
        return categoryData.size() + 2;
      }

      @Override
      public Fragment getItem(int position) {

        Fragment cachedFragment = cache[position]
        if(cachedFragment == null){
            if (position == 0) {
                cache[position] = ProductFragment.newInstance("2", categoryId, categoryName);
                cachedFragment = cache[position];
            } else if (position == 1) {
                cache[position] = ProductFragment.newInstance("3", categoryId, categoryName);
                cachedFragment = cache[position];
            } else {
                cache[position]= ProductFragment.newInstance("1", categoryData.get(position - 2).getCategoryId(), categoryName);
                cachedFragment = cache[position];
            }
        }
        return cachedFragment;
      }
      ...
  }
公共类PagerNewProductAdapter扩展了FragmentStatePagerAdapter{
片段[]缓存;
RealmList分类数据;
...
公共PagerNewProductAdapter(片段片段、RealmList类别、字符串categoryName、字符串categoryId、环境环境){
...
this.categoryName=categoryName;
this.cache=新片段[getCount()];
}
@凌驾
public int getCount(){
返回categoryData.size()+2;
}
@凌驾
公共片段getItem(int位置){
片段cachedFragment=缓存[位置]
if(cachedFragment==null){
如果(位置==0){
cache[position]=ProductFragment.newInstance(“2”,categoryId,categoryName);
cachedFragment=缓存[位置];
}否则如果(位置==1){
cache[position]=ProductFragment.newInstance(“3”,categoryId,categoryName);
cachedFragment=缓存[位置];
}否则{
cache[position]=ProductFragment.newInstance(“1”,categoryData.get(position-2).getCategoryId(),categoryName);
cachedFragment=缓存[位置];
}
}
返回cachedFragment;
}
...
}

只需像下面这样添加setOffscreenPageLimit:

    viewPager = findViewById(R.id.viewpager);
    viewPager.setOffscreenPageLimit(3);

3=viewpager中的片段数。

我认为您需要使用片段。它正在按照您的要求工作。如果你有任何疑问,请告诉我

步骤1: 实现碎片化

步骤2: 从SupportActivity而不是AppActivity扩展您的活动 从SupportFragment而不是fragment扩展片段

步骤3: 从片段中删除onresume和onpause方法

步骤4: 调用onPause();在onViewCreated方法中

@Override
    public void onSupportVisible() {
        super.onSupportVisible();
       onResume();
        if(!isLoaded){
            isLoaded = true;
//Load your data here 
}
}
@Override
    public void onSupportInvisible() {
        super.onSupportInvisible();
       onPause();
    }
步骤5: 设置设置限制 viewPager.setOffscreenPageLimit(numberi)


快乐编码。

getItem将保持不变?没有ch