2016-09-19 6 views
0

Hy、私はAndroid開発アプリが初めてで、viewLayoutのビューページャを使用してアプリケーションを作成したいと思います。リストも含まれているフラグメントがあり、このフラグメントを作成したい選択されたタブに応じて、すべてのページで異なるデータで表示されます。私はこれをほぼ達成しましたが、私はviewPagerページの作成に問題があります。マイViewPagerAdapter extemds FragmentStatePagerAdapter、それは次のようになります。問題は、ページをスワイプであるViewPagerスライドが最初と最後のフラグメントをスキップしています

viewPager = (ViewPager) findViewById(R.id.pager); 
     final ViewPagerAdapter adapter = new ViewPagerAdapter(getSupportFragmentManager()); 

     viewPager.setAdapter(adapter); 

     viewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tabLayout)); 
     tabLayout.setOnTabSelectedListener(new TabLayout.OnTabSelectedListener() { 
      @Override 
      public void onTabSelected(TabLayout.Tab tab) { 
       viewPager.setCurrentItem(tab.getPosition()); 

      } 

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

      } 

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

      } 
     }); 

    } 

:活動は、最初に作成するときに、私がいるのを見ましたログを

public class ViewPagerAdapter extends FragmentStatePagerAdapter{ 
    static final int NUM_ITEMS = 7; 


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

    @Override 
    public Fragment getItem(int position) { 
     Log.e("new instance",position+""); 
     Fragment fragment=null; 

     switch (position) 
     { 
      case 0: fragment=new ChannelListFragment(); 
       Log.e("new instance ",position+""); 
       break; 
      case 1: fragment= new ChannelListFragment(); 
       Log.e("new instance ",position+""); 

       break; 
      case 2: fragment=new ChannelListFragment(); 
       Log.e("new instance ",position+""); 

       break; 
      case 3: fragment=new ChannelListFragment(); 
       Log.e("new instance ",position+""); 

       break; 
      case 4: fragment=new ChannelListFragment(); 
       Log.e("new instance ",position+""); 

       break; 
      case 5: fragment=new ChannelListFragment(); 
       Log.e("new instance ",position+""); 

       break; 
      case 6: fragment=new ChannelListFragment(); 
       Log.e("new instance ",position+""); 

       break; 

     } 
     return fragment; 
    } 

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

私MainActivityで私はこれをやっています最初のページの位置0と位置1を作成した後、2番目のタブの位置2を作成し、3番目のタブの位置3、6番目のタブの位置4,5,6を作成します。スクロールバックでは4,3,2,1,0を作成し、最初のフラグメントは何も作成しません。これは、選択したタブに応じてデータを設定するときのアプリの機能に影響します。 ページャがアイテム0とアイテム6を含むページに1つのフラグメントを作成するように修正できますか?デフォルトでは

+0

[ViewPager Fragmentのデータを更新](http://stackoverflow.com/questions/36503779/refresh-data-in-viewpager-fragment)の複製が可能です。基本的にViewPagerは、現在のFragmentとFragmentをどちら側にも保持します迅速なスワイプを滑らかに保つために生きています。それぞれのフラグメントがロードされたときに何かをする必要がある場合は、リンクされた答えに記述されているメソッドを使用します。 –

答えて

0
 viewPager = (ViewPager) findViewById(R.id.pager); 
     final ViewPagerAdapter adapter = new ViewPagerAdapter(getSupportFragmentManager()); 

     viewPager.setAdapter(adapter); 
     tabLayout.setupWithViewPager(viewPager) // link the given ViewPager and this TabLayout together so that changes in one are automatically reflected in the other 
     viewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tabLayout)); 

    } 

、いずれかのユーザーが左右に現在のページをスクロールしたときに優れたユーザーエクスペリエンスを持っているように、現在のページの側は、作成され、キャッシュされます。 最初のページが読み込まれたとき(ページ1と2が作成されたとき) 2番目のページにスワイプすると1と2がすでにメモリに格納されているため、ページが右から3番目のページだけが読み込まれます。

詳細については、linkをご覧ください。

また、tablayoutはviewpagerとtablayoutをリンクする便利なメソッドsetUpWithViewPagerを提供します。現在の項目を手動で設定する代わりに、このメソッドを使用できます。

関連する問題