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

それが画面外のページの制限を無効にすることは可能ですか?

いいえ、表示されているページの両側に1ページずつ設定されています。これは、アニメーション効果を有効にするために必要です。同時に2つのフラグメント(元と新規)の部分が表示されます。

oncreate(){ 

setHasOptionsMenu(true); 

} 

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 
     } 

} 

0

最後のフラグメントは、これは、すべての初期化shud唯一の方法でユーザに表示されている場合にのみ呼び出されsetuservisiblehint(と呼ばれる方法)がありますあなたの意見

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

ページャアダプタを設定し、それと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) 
    { 
    } 
}); 
関連する問題