9

Material Design Supportライブラリでウィザードを実装したいと思います。選択したタブを変更せずにTabLayoutを動的に更新する

私はViewPagerTablayoutを使用していますが、新しいタブを動的に追加する際に問題があります。

まず、私はonCreate方法で私のウィジェットを設定します。

viewPager = (ViewPager) findViewById(R.id.tab_viewpager); 
tabLayout = (TabLayout) findViewById(R.id.tab_layout); 

adapter = new ViewPagerAdapter(getSupportFragmentManager()); 
adapter.addFrag(new DummyFragment(), "1"); 
adapter.addFrag(new DummyFragment(), "2"); 
viewPager.setAdapter(adapter); 
tabLayout.setupWithViewPager(viewPager); 

は、それから私は、リスト内の要素をクリックしたときに、別のカードを追加したい:

adapter.addFrag(new DummyFragment(), "3"); 
adapter.notifyDataSetChanged(); 
tabLayout.setTabsFromPagerAdapter(adapter); 

問題は次のとおりです。追加後、選択したカードが最初にリセットされました。

この現象を防止するにはどうすればよいですか?

答えて

0

ちょうど同じ問題に走った、そして幸運にも解決策を見出した(ないきれいなものを、それが動作します):

あなたは、タブを更新する必要があります。

pageradapter.notifyDataSetChanged(); 
for (int i = 0; i < viewpager.getCount(); i++) { 
    sectionsTabLayout.getTabAt(i).setText(sectionsViewPagerAdapter.getPageTitle(i)); 
} 
0

これは、わずかな修正であります@ Kalpitコードに変換する。 この新しいタブをレイアウトに動的に追加し、setupWithViewPagerメソッドを使用するときにtablayoutによって呼び出されるアダプタから同じメソッドを呼び出すことによってタイトルを割り当てる必要があります。まだ作成されていないタブに対してこのtry catchステートメントを使用しましたまだそれらにいくつかのタイトルを割り当てようとするかもしれません。

adapter.notifyDataSetChanged(); 
    for(int i = 0;i<adapter.getCount();i++){ 
     try{ 
     tablayout.getTabAt(i).setText(adapter.getPageTitle(i)); 
     } 
     catch(IndexOutOfBoundException e){ 
     tablayout.addTab(tablayout.newTab().setText(adapter.getPageTitle(i)); 
     } 
    }