0

我有一個帶有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); 
     } 
    } 
} 

回答

0

使用尋呼機佈局這個完整的代碼

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); 
      } 

     } 
    } 
0

是否有可能禁用屏幕外頁數限制?

不是。它已被設置爲最小可能值:查看頁面的每一側有一頁。這對於使動畫效果起作用是必要的 - 您可以同時看到兩個片段(原始和新的)的部分。

0

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() 

} 
0

這是我的解決方案,它按預期工作。在所有孩子的片段創建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) 
    { 
    } 
}); 
相關問題