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