在ViewPager中加载片段只有当它被选中时

问题描述:

我有一个带有3个选项卡的ViewPager。在ViewPager中加载片段只有当它被选中时

我在每个碎片中加载大数据。

该应用程序加载每个片段,但我只想选择它时加载片段。

我该怎么做?我不知道。 我在等你的帮助。谢谢

我的代码:

public class Fragments extends AppCompatActivity { 

    private TabLayout tabLayout; 
    private ViewPager viewPager; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.fragment_tabs); 

     viewPager = (ViewPager) findViewById(R.id.viewpager); 
     setupViewPager(viewPager); 

     tabLayout = (TabLayout) findViewById(R.id.tabs); 
     tabLayout.setupWithViewPager(viewPager); 
    } 

    private void setupViewPager(ViewPager viewPager) { 
     ViewPagerAdapter adapter = new ViewPagerAdapter(getSupportFragmentManager()); 
     adapter.addFragment(new FirstFragment(), "1"); 
     adapter.addFragment(new SecondFragment(), "2"); 
     adapter.addFragment(new ThirdFragment(), "3"); 
     viewPager.setAdapter(adapter); 
    } 

    class ViewPagerAdapter extends FragmentPagerAdapter { 
     private final List<Fragment> mFragmentList = new ArrayList<>(); 
     private final List<String> mFragmentTitleList = new ArrayList<>(); 

     public ViewPagerAdapter(FragmentManager manager) { 
      super(manager); 
     } 

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

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

     public void addFragment(Fragment fragment, String title) { 
      mFragmentList.add(fragment); 
      mFragmentTitleList.add(title); 
     } 

     @Override 
     public CharSequence getPageTitle(int position) { 
      return mFragmentTitleList.get(position); 
     } 
    } 
} 

使用寻呼机布局这个完整的代码

mPager = (ViewPager)findViewById(R.id.pager); 
mPager.setPageTransformer(true, new ZoomOutPageTransformer()); 
mPagerAdapter = new ScreenSlidePagerAdapter(getSupportFragmentManager()); 
PagerTitleStrip pts=(PagerTitleStrip)findViewById(R.id.titles); 
pts.setNonPrimaryAlpha(0); 
TabLayout tl=(TabLayout)findViewById(R.id.diary_tabs); 
tl.setupWithViewPager(mPager); 
mPager.setAdapter(mPagerAdapter); 
for (int i = 0; i < tl.getTabCount(); i++) { 
    TabLayout.Tab tab = tl.getTabAt(i); 
    tab.setCustomView(getTabView(i)); 
} 
private class ScreenSlidePagerAdapter extends FragmentStatePagerAdapter { 
     public ScreenSlidePagerAdapter(FragmentManager fm) { 
      super(fm); 
     } 

     @Override 
     public Fragment getItem(int position) { 
      switch (position) { 
       case 0: 
        return new Fragment1(); 
       case 1: 
        return new Fragment2(); 
       case 2: 
        return new Fragment3(); 
       case 3: 
        return new Fragment4(); 
       case 4: 
        return new Fragment5(); 
       default: 
        return new Fragment6(); 
      } 
     } 

     @Override 
     public int getCount() { 
      return NUM_PAGES; 
     } 

     @Override 
     public CharSequence getPageTitle(int position) { 
      switch (position) { 
       case 0: 
        return getResources().getString(R.string.string1); 
       case 1: 
        return getResources().getString(R.string.string2); 
       case 2: 
        return getResources().getString(R.string.string3); 
       case 3: 
        return getResources().getString(R.string.string4); 
       case 4: 
        return getResources().getString(R.string.string5); 
       default: 
        return super.getPageTitle(position); 
      } 

     } 
    } 

是否有可能禁用屏幕外页数限制?

不是。它已被设置为最小可能值:查看页面的每一侧有一页。这对于使动画效果起作用是必要的 - 您可以同时看到两个片段(原始和新的)的部分。

OncreateView(){ 

//.... dont initialize your view here 

if(isMenuVisible()) { // menu should be visible if current fragment is visible right now 
      setUserVisibleHint(true); // manually set value to true 
     } 

} 

oncreate(){ 

setHasOptionsMenu(true); 

} 

最后有方法称为setuservisiblehint()仅调用时,这个片段对用户可见这是你shud初始化所有的唯一方法你的意见。

@Override 
    public void setUserVisibleHint(boolean isVisibleToUser) { 
     super.setUserVisibleHint(isVisibleToUser); 

     if(isVisibleToUser && v != null) { 

       // initialize your view here and call you fetch_data_function() 

} 

这是我的解决方案,它按预期工作。在所有孩子的片段创建boolean变量:

private boolean loadFragmentExecuted = false; 
在孩子片段

创建一个名为loadFragment通用的方法,并将所有你onCreateView添加到该方法的逻辑:

public void loadFragment() 
{ 
    if(!loadFragmentExecuted) 
    { 
     //Add your logic to manipulate the UI or load data etc... 
     loadFragmentExecuted = true; 
    } 
} 

在您的浏览量逻辑创建片段动态,如:

//add the fragment 
String fragmentName = "com.something." + fragmentId; 

//check if the class exists 
try 
{ 
    Class myFragmentClass = Class.forName(fragmentName); 
    Fragment myFragment = (Fragment) myFragmentClass.newInstance(); 
    mFragments.add(myFragment); 
} 
catch (ClassNotFoundException e) 
{ 
    e.printStackTrace(); 
} 
catch (IllegalAccessException e) 
{ 
    e.printStackTrace(); 
} 
catch (InstantiationException e) 
{ 
    e.printStackTrace(); 
} 

然后设置您的寻呼机适配器和附加TA blayout与它:

//set our pager adapter that contains different fragments 
mPagerAdapter = new BasePagerAdapter(mFragmentManager, mFragments); 

//link the adapter to the viewpager 
mViewPager.setAdapter(mPagerAdapter); 

//cache fragments 
int limit = (mPagerAdapter.getCount() > 0 ? mPagerAdapter.getCount() : 1); 
mViewPager.setOffscreenPageLimit(limit); 

//add the page listner to the viewPager and link it to the tabLayout 
mViewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(mTabLayout)); 

//on tab selected select current viewpager item 
mTabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() 
{ 
    @Override 
    public void onTabSelected(TabLayout.Tab tab) 
    { 
     mViewPager.setCurrentItem(tab.getPosition()); 

     //get fragment for the selected tab 
     Fragment f = mPagerAdapter.getItem(tab.getPosition()); 

     //load the content of the fragment 
     try 
     { 
      Class c = f.getClass(); 
      Method loadFragment = c.getMethod("loadFragment"); 
      loadFragment.invoke(f); 
     } 
     catch (IllegalAccessException e){} 
     catch (InvocationTargetException e){} 
     catch (NoSuchMethodException e){} 
    } 

    @Override 
    public void onTabUnselected(TabLayout.Tab tab) 
    { 
    } 

    @Override 
    public void onTabReselected(TabLayout.Tab tab) 
    { 
    } 
});