7

フラグメントの間を移動するには、すべてのMainActivityツールバーを使用しますが、それぞれのフラグメントにはそれぞれTabLayoutの3つのタブがあり、それぞれのタブにはRecyclerViewを使用して別のテキストと画像を表示します。Android TabLayout内のフラグメント

私はこの前回、フラグメントの代わりにactvitiesを使用しましたが、現在はフラグメントを使用する方が良いと思います。

ViewPagerを入れてタブにアダプタを接続するとすぐにタブが機能するようになっていますが、引き出しから新しいフラグメントを開くと、ここで問題になる可能性のあるヌルポインタが表示されます?

MainActivity.java

public class MainActivity extends AppCompatActivity 

    implements NavigationView.OnNavigationItemSelectedListener { 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
    setSupportActionBar(toolbar); 

    DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout); 
    ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
      this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close); 
    drawer.setDrawerListener(toggle); 
    toggle.syncState(); 

    NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view); 
    navigationView.setNavigationItemSelectedListener(this); 
} 

@Override 
public void onBackPressed() { 
    DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout); 
    if (drawer.isDrawerOpen(GravityCompat.START)) { 
     drawer.closeDrawer(GravityCompat.START); 
    } else { 
     super.onBackPressed(); 
    } 
} 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    getMenuInflater().inflate(R.menu.main, menu); 
    return true; 
} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    int id = item.getItemId(); 
    return id == R.id.action_settings || super.onOptionsItemSelected(item); 

} 

@Override 
public boolean onNavigationItemSelected(MenuItem item) { 
    int id = item.getItemId(); 
    Fragment fragment; 

    if (id == R.id.fragment_one) { 
     fragment = new NewFragment(); 
     FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); 
     ft.replace(R.id.container, fragment); 
     ft.commit(); 

    } else if (id == R.id.fragment_two) { 

     fragment = new NewFragment(); 
     FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); 
     ft.replace(R.id.container, fragment); 
     ft.commit(); 

    } else if (id == R.id.fragment_three) { 

     fragment = new NewFragment(); 
     FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); 
     ft.replace(R.id.container, fragment); 
     ft.commit(); 

    } 

    DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout); 
    drawer.closeDrawer(GravityCompat.START); 
    return true; 
} 
} 

activity_main.xml

<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:app="http://schemas.android.com/apk/res-auto" 
xmlns:tools="http://schemas.android.com/tools" 
android:id="@+id/drawer_layout" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:fitsSystemWindows="true" 
tools:openDrawer="start"> 

<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:fitsSystemWindows="true" 
    tools:context="com.xcandy.guideforfifa17.MainActivity"> 

    <android.support.design.widget.AppBarLayout 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:theme="@style/AppTheme.AppBarOverlay"> 

     <android.support.v7.widget.Toolbar 
      android:id="@+id/toolbar" 
      android:layout_width="match_parent" 
      android:layout_height="?attr/actionBarSize" 
      android:background="?attr/colorPrimary" 
      app:popupTheme="@style/AppTheme.PopupOverlay" /> 

    </android.support.design.widget.AppBarLayout> 

    <include layout="@layout/content_main" /> 

</android.support.design.widget.CoordinatorLayout> 

<android.support.design.widget.NavigationView 
    android:id="@+id/nav_view" 
    android:layout_width="wrap_content" 
    android:layout_height="match_parent" 
    android:layout_gravity="start" 
    android:fitsSystemWindows="true" 
    app:headerLayout="@layout/nav_header_main" 
    app:menu="@menu/activity_main_drawer" /> 

</android.support.v4.widget.DrawerLayout> 

NewFragment.java

public class NewFragment extends Fragment { 

private RecyclerView mRecyclerView; 


@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 
    View view = inflater.inflate(R.layout.activity_fragment_one, container, false); 

    TabLayout tabLayout = (TabLayout) view.findViewById(R.id.tabs); 
    tabLayout.addTab(tabLayout.newTab().setText("A")); 
    tabLayout.addTab(tabLayout.newTab().setText("B")); 
    tabLayout.addTab(tabLayout.newTab().setText("C")); 

    final ViewPager viewPager = (ViewPager) view.findViewById(R.id.viewpager); 

    mRecyclerView = (RecyclerView) view.findViewById(R.id.recycler_view); 

    RecyclerView.LayoutManager mLayoutManager = new LinearLayoutManager(getActivity()); 
    mRecyclerView.setLayoutManager(mLayoutManager); 


    viewPager.setAdapter(new PagerAdapter 
      (getFragmentManager(), tabLayout.getTabCount())); 
    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) { 

     } 
    }); 

    return view; 
} 

public class PagerAdapter extends FragmentStatePagerAdapter { 
    int mNumOfTabs; 

    public PagerAdapter(FragmentManager fm, int NumOfTabs) { 
     super(fm); 
     this.mNumOfTabs = NumOfTabs; 
    } 



    @Override 
    public Fragment getItem(int position) { 

     switch (position) { 
      case 0: 

       RecyclerView.Adapter mAdapter = new AdapterOne(); 
       mRecyclerView.setAdapter(mAdapter); 

      case 1: 

       mAdapter = new AdapterTwo(); 
       mRecyclerView.setAdapter(mAdapter); 

      case 2: 

       mAdapter = new AdapterThree(); 
       mRecyclerView.setAdapter(mAdapter); 

      default: 
       return null; 
     } 
    } 

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

activity_fragment.xml

<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:app="http://schemas.android.com/apk/res-auto" 
xmlns:tools="http://schemas.android.com/tools" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:fitsSystemWindows="true" 
tools:context=".NewFragment"> 

<android.support.design.widget.AppBarLayout 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:theme="@style/AppTheme.AppBarOverlay"> 

    <android.support.design.widget.TabLayout 
     android:id="@+id/tabs" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     app:tabMode="fixed" 
     app:tabGravity="fill"/> 

</android.support.design.widget.AppBarLayout> 

<android.support.v4.view.ViewPager 
    android:id="@+id/viewpager" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:background="@android:color/white"/> 

<android.support.v7.widget.RecyclerView 
    android:id="@+id/recycler_view" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    /> 

</android.support.design.widget.CoordinatorLayout> 

エラーログ

    --------- beginning of crash 
06-23 11:19:56.985 2466-2466/com.candyx.sims E/AndroidRuntime: FATAL EXCEPTION: main 
                   Process: com.candyx.sims, PID: 2466 
                   java.lang.NullPointerException: Attempt to invoke virtual method 'void android.support.v7.widget.RecyclerView.setLayoutManager(android.support.v7.widget.RecyclerView$LayoutManager)' on a null object reference 
                    at com.candyx.sims.BlankFragment.onCreateView(BlankFragment.java:38) 
                    at android.support.v4.app.Fragment.performCreateView(Fragment.java:1974) 
                    at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1067) 
                    at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1252) 
                    at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:742) 
                    at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1617) 
                    at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:517) 
                    at android.os.Handler.handleCallback(Handler.java:739) 
                    at android.os.Handler.dispatchMessage(Handler.java:95) 
                    at android.os.Looper.loop(Looper.java:135) 
                    at android.app.ActivityThread.main(ActivityThread.java:5254) 
                    at java.lang.reflect.Method.invoke(Native Method) 
                    at java.lang.reflect.Method.invoke(Method.java:372) 
                    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903) 
                    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698) 
06-23 11:23:14.912 5839-5873/com.candyx.sims D/OpenGLRenderer: Use EGL_SWAP_BEHAVIOR_PRESERVED: true 

                   [ 06-23 11:23:14.920 5839: 5839 D/   ] 
                   HostConnection::get() New Host Connection established 0xb4125190, tid 5839 
06-23 11:23:14.927 5839-5839/com.candyx.sims D/Atlas: Validating map... 
06-23 11:23:15.011 5839-5873/com.candyx.sims I/OpenGLRenderer: Initialized EGL, version 1.4 
06-23 11:23:15.027 5839-5873/com.candyx.sims D/OpenGLRenderer: Enabling debug mode 0 
06-23 11:23:15.039 5839-5873/com.candyx.sims W/EGL_emulation: eglSurfaceAttrib not implemented 
06-23 11:23:15.039 5839-5873/com.candyx.sims W/OpenGLRenderer: Failed to set EGL_SWAP_BEHAVIOR on surface 0xae838600, error=EGL_SUCCESS 
06-23 11:23:16.444 5839-5839/com.candyx.sims W/PathParser: Points are too far apart 4.000000596046461 
06-23 11:23:17.342 5839-5839/com.candyx.sims W/PathParser: Points are too far apart 4.000000596046461 
06-23 11:23:17.350 5839-5839/com.candyx.sims I/AppCompatViewInflater: app:theme is now deprecated. Please move to using android:theme instead. 
06-23 11:23:17.369 5839-5839/com.candyx.sims D/AndroidRuntime: Shutting down VM 
06-23 11:23:17.369 5839-5839/com.candyx.sims E/AndroidRuntime: FATAL EXCEPTION: main 
                   Process: com.candyx.sims, PID: 5839 
                   java.lang.NullPointerException: Attempt to invoke virtual method 'void android.support.v7.widget.RecyclerView.setLayoutManager(android.support.v7.widget.RecyclerView$LayoutManager)' on a null object reference 
                    at com.candyx.sims.NewFragment.onCreateView(NewFragment.java:38) 
                    at android.support.v4.app.Fragment.performCreateView(Fragment.java:1974) 
                    at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1067) 
                    at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1252) 
                    at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:742) 
                    at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1617) 
                    at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:517) 
                    at android.os.Handler.handleCallback(Handler.java:739) 
                    at android.os.Handler.dispatchMessage(Handler.java:95) 
                    at android.os.Looper.loop(Looper.java:135) 
                    at android.app.ActivityThread.main(ActivityThread.java:5254) 
                    at java.lang.reflect.Method.invoke(Native Method) 
                    at java.lang.reflect.Method.invoke(Method.java:372) 
                    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903) 
                    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698) 
06-23 11:25:16.961 7518-7518/com.candyx.sims W/art: Before Android 4.1, method android.graphics.PorterDuffColorFilter android.support.graphics.drawable.VectorDrawableCompat.updateTintFilter(android.graphics.PorterDuffColorFilter, android.content.res.ColorStateList, android.graphics.PorterDuff$Mode) would have incorrectly overridden the package-private method in android.graphics.drawable.Drawable 
06-23 11:25:17.078 7518-7548/com.candyx.sims D/OpenGLRenderer: Use EGL_SWAP_BEHAVIOR_PRESERVED: true 

                   [ 06-23 11:25:17.081 7518: 7518 D/   ] 
                   HostConnection::get() New Host Connection established 0xb412a1f0, tid 7518 
06-23 11:25:17.082 7518-7518/com.candyx.sims D/Atlas: Validating map... 
06-23 11:25:17.109 7518-7548/com.candyx.sims I/OpenGLRenderer: Initialized EGL, version 1.4 
06-23 11:25:17.126 7518-7548/com.candyx.sims D/OpenGLRenderer: Enabling debug mode 0 
06-23 11:25:17.134 7518-7548/com.candyx.sims W/EGL_emulation: eglSurfaceAttrib not implemented 
06-23 11:25:17.134 7518-7548/com.candyx.sims W/OpenGLRenderer: Failed to set EGL_SWAP_BEHAVIOR on surface 0xb41234c0, error=EGL_SUCCESS 
06-23 11:25:31.030 7518-7518/com.candyx.sims W/PathParser: Points are too far apart 4.000000596046461 
06-23 11:25:32.174 7518-7518/com.candyx.sims W/PathParser: Points are too far apart 4.000000596046461 
06-23 11:25:32.187 7518-7518/com.candyx.sims I/AppCompatViewInflater: app:theme is now deprecated. Please move to using android:theme instead. 
06-23 11:25:32.207 7518-7518/com.candyx.sims D/AndroidRuntime: Shutting down VM 
06-23 11:25:32.207 7518-7518/com.candyx.sims E/AndroidRuntime: FATAL EXCEPTION: main 
                   Process: com.candyx.sims, PID: 7518 
                   java.lang.NullPointerException: Attempt to invoke virtual method 'void android.support.v7.widget.RecyclerView.setLayoutManager(android.support.v7.widget.RecyclerView$LayoutManager)' on a null object reference 
                    at com.candyx.sims.NewFragment.onCreateView(NewFragment.java:38) 
                    at android.support.v4.app.Fragment.performCreateView(Fragment.java:1974) 
                    at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1067) 
                    at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1252) 
                    at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:742) 
                    at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1617) 
                    at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:517) 
                    at android.os.Handler.handleCallback(Handler.java:739) 
                    at android.os.Handler.dispatchMessage(Handler.java:95) 
                    at android.os.Looper.loop(Looper.java:135) 
                    at android.app.ActivityThread.main(ActivityThread.java:5254) 
                    at java.lang.reflect.Method.invoke(Native Method) 
                    at java.lang.reflect.Method.invoke(Method.java:372) 
                    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903) 
                    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698) 
+0

の使用getChildFragmentManager()が 'すぎ –

+0

質問にエラーログを追加投稿する –

+0

activity_main.xml'あなたは、エラーはあなたが取得しログインしてください何であるか' TabLayout' and'ViewPager' –

答えて

9

あなたのコードに見た後、私はあなたがペンシルベニア州ののgetItem方法でフラグメントを返すことを忘れことがわかりましたFragmentStatePagerAdapterからオーバーライドしたgerAdapterであり、null値が返されるたびにbreakステートメントが存在しないためです。

これを行うには、ViewPagerの各ページに別の新しいフラグメントを作成するか、ViewPagerのすべてのページで使用できる新しいフラグメントを1つ作成する必要があります。

親フラグメントで定義したビューページャのタブに同じrecyclerviewを使用することはできません。

activity_fragment_one。xml

<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:fitsSystemWindows="true" 
    tools:context=".NewFragment"> 

    <android.support.design.widget.AppBarLayout 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:theme="@style/AppTheme.AppBarOverlay"> 

     <android.support.design.widget.TabLayout 
      android:id="@+id/tabs" 
      android:layout_width="match_parent" 
      app:layout_behavior="@string/appbar_scrolling_view_behavior" 
      app:tabTextAppearance="?android:attr/textAppearanceMedium" 
      app:tabTextColor="#ffffff" 
      android:layout_height="?android:actionBarSize" 
      app:tabMode="fixed" 
      app:tabGravity="fill"/> 

    </android.support.design.widget.AppBarLayout> 

    <android.support.v4.view.ViewPager 
     android:id="@+id/viewpager" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     app:layout_behavior="@string/appbar_scrolling_view_behavior" 
     android:background="@android:color/white"/> 
</android.support.design.widget.CoordinatorLayout> 

あなたのフラグメントを修正し、ViewPager Pagesで使用できる新しいフラグメントを作成しました。

ビューポケットベルの各ページのフラグメントタブ(または、必要に応じてページごとに異なるフラグメントを作成できます)。

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" android:layout_width="match_parent" 
    android:layout_height="match_parent"> 
    <android.support.v7.widget.RecyclerView 
     android:id="@+id/recycler_view" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     /> 


</LinearLayout> 
+0

貴重な助けをおかげでありがとう。 – hitesh141

0

この方法間違ったPagerAdaptergetItem、それはあなたがFragmentを返すべきFragmentのinit を返します。そして断片では、あなたはsetViewrecyclerViewそれに

2

エラーログなしでは、NullPointerExceptionを得ることは難しいです。

私の注目を集めた最初のことは、TabLayoutViewPagerをリンクしていないことです。あなたがViewPager用のアダプタを設定した後、次のコードを使用します

// setUpWithViewPager doesn't work without using a Runnable interface. 
// Support library bug, maybe? 
tabLayout.post(new Runnable() { 
    @Override 
    public void run() { 
     tabLayout.setupWithViewPager(viewPager); 
    } 
}); 

私はこれが問題であるかどうかわからないんだけど、それを試してみる:)

+0

私がtabLayoutを呼び出した後。setupWithViewPager(viewPager); - タブの名前がなくなります – tieorange

+0

@tieorangeコードを投稿できますか? codepen.ioまたはpastebin.comを使用してください – adhirajsinghchauhan

0

私はgetChildFragmentManagerの代わりでgetFragmentManagerを使用することをお勧め

viewPager.setAdapter(new PagerAdapter (getFragmentManager(), tabLayout.getTabCount()));

0

public class FragmentTab extends Fragment { 
RecyclerView mRecyclerView; 

@Nullable 
@Override 
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { 
    View view = inflater.inflate(R.layout.fragment_tab, container, false); 

    mRecyclerView = (RecyclerView) view.findViewById(R.id.recycler_view); 
    LinearLayoutManager mLayoutManager = new LinearLayoutManager(getActivity()); 
    mLayoutManager.setOrientation(LinearLayoutManager.VERTICAL); 
    mRecyclerView.setLayoutManager(mLayoutManager); 
    RecyclerView.Adapter mAdapter = new AdapterOne(); 
    mRecyclerView.setAdapter(mAdapter); 
    return view; 
} 
} 

fragment_tab.xmlはまあ、いくつかの時間前、私はまったく同じアプリのデザインを実装しました。私はタブとViewPagerを保持することを意図した断片を持っていました。それはやりがいのある仕事でした。私はあなたと同様の問題に直面したことを思い出します。ここで私はそれを解決する方法である:

レイアウト順序は次のとおりです。

Activity -> Fragment -> Tab Layout + ViewPager -> FragmentStatePagerAdapter -> Fragment -> RecyclerView

あなたの主な活動とは何の関係も持っていないしました。すべてのものは断片的です。だからactivity_main.xmlのTabLayoutから取り除く。

ページャ内のネストされたフラグメントに対処する必要があります。すべてのページコンテンツがそこになければならず、TabLayoutはViewPagerと同じレイアウトになければなりません。

私のプロジェクトは少し古く、意味がある場合はandroid.support.v4.app.Fragmentを使用しました。あなたが必要としないデータからソースを取り除いたので、一部の孤立したメソッドを参照することがあります。

カテゴリの価格リストを表示し、各カテゴリの商品を独自のページに表示することで、水平スワイプでカテゴリとスワップリストを切り替えることができました。

ViewPagerとTabLayoutと各フラグメントはsubfragment_price_list_pager.xmlレイアウトを以下しています。ここ

<?xml version="1.0" encoding="utf-8"?> 
<android.support.v7.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:background="@color/icons" 
    app:cardCornerRadius="4dp" 
    app:cardElevation="4dp" 
    app:cardPreventCornerOverlap="true"> 

    <android.support.v7.widget.Toolbar 
     android:id="@+id/priceListToolbar" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:elevation="4dp" 
     android:theme="@style/AppTheme.Toolbar.TabLayout" 
     app:navigationIcon="@drawable/ic_tag_multiple_grey600_24dp" 
     tools:ignore="UnusedAttribute"> 

     <android.support.design.widget.TabLayout 
      android:id="@+id/tabBar" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:layout_alignParentLeft="true" 
      android:layout_alignParentStart="true" /> 
    </android.support.v7.widget.Toolbar> 

    <android.support.v4.view.ViewPager 
     android:id="@+id/priceList" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:layout_marginTop="58dp" 
     android:padding="5dp" 
     android:scrollbars="horizontal" /> 


</android.support.v7.widget.CardView> 

PriceListPagerFragment.class次のとおりです。

public class PriceListPagerFragment extends Fragment { 
    private static final String TAG = "PriceListPagerFragment"; 
    private PriceList mPriceList; 

    private ViewPager mCategoriesViewPager; 
    private TabLayout tabLayout; 

    private Loader<PriceList> priceListLoader; 
    private EditText scanerBarcodeText; 
    private OnCartActionListener mListener; 

    @Nullable 
    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     View rootView = inflater.inflate(R.layout.subfragment_price_list_pager, container, false); 

     // Pager that would be inflated with page fragments. 
     mCategoriesViewPager = (ViewPager) rootView.findViewById(R.id.priceList); 
     tabLayout = (TabLayout) rootView.findViewById(R.id.tabBar); 
     tabLayout.setTabMode(TabLayout.MODE_SCROLLABLE); 

     // Do all the stuff with pager here: 
     updatePriceListPages(); 

     return rootView; 
    } 


    private void updatePriceListPages() { 
     if (mCategoriesViewPager != null && mPriceList != null) { 
      Log.d(TAG, this + "updatePriceListPages"); 
      if (mCategoriesViewPager.getAdapter() == null) { 


       PriceListCategoriesAdapter adapter = new PriceListCategoriesAdapter(
         getFragmentManager(), 
         tabLayout 
       ); 
       mCategoriesViewPager.setAdapter(
         adapter 
       ); 
       // Each page is a content of a single category of one-level catalog 
       // We did not supply catalog to adapter before it is bound to ViewPager for some serious reason which I can't recall now 
       adapter.setPriceList(mPriceList); 

       tabLayout.setupWithViewPager(mCategoriesViewPager); 
      } else { 
       ((PriceListCategoriesAdapter) mCategoriesViewPager.getAdapter()).setPriceList(mPriceList); 
      } 
     } 
    } 
} 

カスタムFragmentStatePagerAdapter実装、PriceListCategoriesAdapter.class

public class PriceListCategoriesAdapter extends FragmentStatePagerAdapter { 
    private static final String TAG = "PriceListCategoriesAd"; 
    private final TabLayout mTabLayout; 
    private FragmentManager mFm; 
    private Vector<PriceListFragment> recyclerViewList; 
    private Vector<String> titles; 

    public PriceListCategoriesAdapter(FragmentManager fm, TabLayout tabLayout) { 
     super(fm); 
     mFm = fm; 
     mTabLayout = tabLayout; 
     recyclerViewList = new Vector<>(); 
     titles = new Vector<>(); 
    } 


    // All the magic with nested page fragments is done here 
    public void setPriceList(PriceList priceList) { 
     boolean updateTabs = false; 

     Vector<String> newTitles = new Vector<>(); 

     int position = 0; 
     for (CatalogItem catalogItem : priceList.getCatalogs()) { 

      if (catalogItem.getProducts() == null) 
       continue; 

      boolean newFragment; 

      PriceListFragment fragment; 
      try { 
       fragment = recyclerViewList.get(position); 
       newFragment = false; 

      } catch (ArrayIndexOutOfBoundsException e) { 
       fragment = new PriceListFragment(); 
       newFragment = true; 
      } 

      fragment.setCatalogItem(catalogItem); 

      newTitles.add(catalogItem.getName()); 

      if (newFragment) { 
       recyclerViewList.add(fragment); 
      } 
      position++; 
     } 

     if (titles.size() != newTitles.size()) { 
      updateTabs = true; 
     } else { 
      for (int position = 0; position < titles.size(); position++) { 
       if (!titles.get(position).equals(newTitles.get(position))) { 
        updateTabs = true; 
        break; 
       } 
      } 
     } 

     titles = newTitles; 
     notifyDataSetChanged(); 

     if (updateTabs) 
      mTabLayout.setTabsFromPagerAdapter(this); 
    } 


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

    @Override 
    public int getItemPosition(Object object) { 
     PriceListFragment fragment = (PriceListFragment) object; 
     String title = (String) fragment.getTitle(); 
     int position = titles.indexOf(title); 

     if (position >= 0) { 
      return position; 
     } else { 
      return POSITION_NONE; 
     } 
    } 

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

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

    // We don't keep states 
    @Override 
    public Parcelable saveState() { 
     return null; 
    } 
    // We don't keep states 
    @Override 
    public void restoreState(Parcelable state, ClassLoader loader) { 
    } 
} 

そして最後にPriceListFragmentレイアウト:

<?xml version="1.0" encoding="utf-8"?> 
<android.support.v7.widget.RecyclerView android:id="@+id/categoryList" 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:scrollbars="vertical" /> 

PriceListFragment.class自体は何も特別なものを持っていません。適切なデータでRecyclerViewをインスタンス化するだけです。

1

代わりgetSupportFragmentManager()

関連する問題