0

私は3つのタブを持つタブ付きアクティビティを持っています。各タブには、いくつかのリスト項目を含むRecyclerViewがあります。アイテムをクリックすると、新しいフラグメントが開き、ツールバーに戻るボタンが表示されます。私の現在の画面は次のようになります。Android - TabLayout - RecyclerViewを使ったナビゲーション

Current Screen

そして今、私はあなたに私のコードが表示されます。 TabLayoutと最初MainActivity.java時:で

public class RvAdapter extends RecyclerView.Adapter<RvAdapter.MyViewHolder> { 

    ArrayList<String> listItems; 

    public RvAdapter (ArrayList<String> listItems){ 
     this.listItems = listItems; 
    } 

    @Override 
    public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 

     View itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.rv_item_layout, null); 

     return new MyViewHolder(itemView); 
    } 

    @Override 
    public void onBindViewHolder(MyViewHolder holder, final int position) { 

     holder.itemTitle.setText(listItems.get(position)); 
     holder.itemImage.setImageResource(R.drawable.ic_keyboard_arrow_right); 


     holder.itemView.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       System.out.println(listItems.get(position)); 
      } 
     }); 

    } 

    @Override 
    public int getItemCount() { 
     return listItems.size(); 
    } 

    public class MyViewHolder extends RecyclerView.ViewHolder{ 

     TextView itemTitle; 
     ImageView itemImage; 

     public MyViewHolder(View itemView){ 
      super(itemView); 

      itemTitle = (TextView) itemView.findViewById(R.id.itemTitle); 
      itemImage = (ImageView) itemView.findViewById(R.id.itemImage); 
     } 

    } 
} 

:ここ

public class Tab1Pflege extends Fragment { 

    private RecyclerView recyclerView; 
    private RecyclerView.Adapter rvAdapter; 
    private RecyclerView.LayoutManager rvLayoutManager; 

    private ArrayList<String> listItems; 

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

     listItems = new ArrayList<>(); 
     listItems.add("Test1"); 
     listItems.add("Test2"); 
     listItems.add("Test3"); 

     recyclerView = (RecyclerView) rootView.findViewById(R.id.recyclerView); 
     rvLayoutManager = new LinearLayoutManager(getActivity()); 
     recyclerView.setLayoutManager(rvLayoutManager); 
     rvAdapter = new RvAdapter(listItems); 
     recyclerView.setAdapter(rvAdapter); 

     return rootView; 
    } 

} 

そして、私のRecyclerViewアダプタである:ここで

public class MainActivity extends AppCompatActivity { 

    private SectionsPagerAdapter mSectionsPagerAdapter; 

    private ViewPager mViewPager; 
    private Toolbar toolbar; 

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

     toolbar = (Toolbar) findViewById(R.id.toolbar); 
     toolbar.setTitle("Pflege"); 
     setSupportActionBar(toolbar); 
     mSectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager()); 

     mViewPager = (ViewPager) findViewById(R.id.container); 
     mViewPager.setAdapter(mSectionsPagerAdapter); 

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

     tabLayout.getTabAt(0).setIcon(R.drawable.tab_icon_pflege); 
     tabLayout.getTabAt(1).setIcon(R.drawable.tab_icon_dokumentation); 
     tabLayout.getTabAt(2).setIcon(R.drawable.tab_icon_probleme); 

     tabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() { 
      @Override 
      public void onTabSelected(TabLayout.Tab tab) { 
       switch(tab.getPosition()) { 
        case 0: 
         mViewPager.setCurrentItem(0); 
         toolbar.setTitle("Pflege"); 
         break; 
        case 1: 
         mViewPager.setCurrentItem(1); 
         toolbar.setTitle("Daten"); 
         break; 
        case 2: 
         mViewPager.setCurrentItem(2); 
         toolbar.setTitle("Probleme"); 
         break; 
        default: 
         mViewPager.setCurrentItem(tab.getPosition()); 
         toolbar.setTitle("Pflege"); 
         break; 
       } 
      } 

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

      } 

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

      } 
     }); 

    } 

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

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     int id = item.getItemId(); 

     if (id == R.id.action_settings) { 
      return true; 
     } 

     return super.onOptionsItemSelected(item); 
    } 

    public class SectionsPagerAdapter extends FragmentPagerAdapter { 

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

     @Override 
     public Fragment getItem(int position) { 
      switch(position){ 
       case 0: 
        Tab1Pflege tab1 = new Tab1Pflege(); 
        return tab1; 
       case 1: 
        Tab2Dokumentation tab2 = new Tab2Dokumentation(); 
        return tab2; 
       case 2: 
        Tab3Probleme tab3 = new Tab3Probleme(); 
        return tab3; 
       default: 
        return null; 
      } 
     } 

     @Override 
     public int getCount() { 
      // Show 3 total pages. 
      return 3; 
     } 

     @Override 
     public CharSequence getPageTitle(int position) { 
      switch (position) { 
       case 0: 
        return "Pflege"; 
       case 1: 
        return "Daten"; 
       case 2: 
        return "Probleme"; 
      } 
      return null; 
     } 
    } 
} 

はRecyclerViewとの最初のタブのための断片でありますこのクラスは、リストアイテムをクリックするためのonClickListenerです。そしてそこに、例えばTest1のための新しい断片を開こうと思っています。その上に、ツールバーに戻るボタンが表示され、RecyclerViewでTab1の概要に戻ることができます。しかし、私はそれをどうやって行うのか分かりません。誰かがそれで私を助けることができますか?

+0

のアイコンをバックに変更することができます現在のシナリオでは、FragmentDialogまたは新しいアクティビティを表示し、ツールバーでbackarrowを表示することができればよいでしょう getSupportActionBar()。setHomeButtonEnabled(true); getSupportActionBar()。setDisplayHomeAsUpEnabled(true); –

答えて

0

onClickでは、

FragmentTransaction trans = getSupportFragmentManager().beginTransaction(); 
Fragment fragment = // TODO: initialise your fragment 'fragment' 
mFragments.push(fragment); 
// Animation, if need it 
// trans.setCustomAnimations(R.anim.right_in, R.anim.left_out, 
//   R.anim.right_out, R.anim.left_in); 

// _container is the id of 'fragment' container in the your xml 
trans.replace(R.id._container, fragment); 

// variable to identify this fragment, and title of the page as well 
String name = // TODO: initialise 
trans.addToBackStack(name); 
trans.commit(); 

getSupportActionBar().setTitle(name); 

とあなたの活動ののonCreate、バックスタックの変更のためのセットアップリスナーに(別のフラグメントをロードするために)このような何かを行うことができます。

FragmentManager manager = getSupportFragmentManager(); 
manager.addOnBackStackChangedListener(mBackStackListener); 

、あなたのプロジェクト全体の構造がFragmentTransactionモードを使用して実装されましたので、またフラグメントで使用されるべきで、その後の断片タブとあなたのMainActivityのviewpagerでプレイしたい場合は、

private OnBackStackChangedListener mBackStackListener = new OnBackStackChangedListener() { 
    @Override 
    public void onBackStackChanged() { 
     FragmentManager manager = getSupportFragmentManager(); 
     int count = manager.getBackStackEntryCount(); 
     if(count > 0) { 
      // TODO: Show back icon 
     } else { 
      // TODO: Other icon 
     } 
    } 
}; 
+0

RVAdapterクラスのonClickでgetSupportFragmentManager()メソッドを呼び出すにはどうすればよいですか? MainAcitvityクラスのメソッドではないので、それは? – Nono

+0

MainActivityには、あなたのfirsrコード部分で "onItemSelected"というメソッドがあります。 Tab1Pflege.javaでは、(MainActivity)getActivity()をRvAdapterクラスのコンストラクタに配置しました。また、onClickListenerには、メインアクティビティから "onItemSelected"メソッドが呼び出されます。ツールバーのタイトルが変更され、古いフラグメントは消えていますが、新しいフラグメントは空です。しかし、私がTab2に行くと、それも空ですが、Tab3はありません。 – Nono

関連する問題