9

Desidero implementare una procedura guidata con Libreria di supporto progettazione materiale.Aggiornamento dinamico di TabLayout senza modificare la scheda selezionata

Sto usando ViewPager e Tablayout ma ho un problema aggiungendo nuove schede dinamicamente.

In primo luogo, ho creato i miei widget in onCreate metodo:

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); 

Poi voglio aggiungere un'altra carta, quando un elemento della lista si fa clic:

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

Il problema è: dopo l'aggiunta, la carta selezionata è stata ripristinata in primo luogo.

Come prevenire questo comportamento?

risposta

0

appena eseguito nello stesso problema, e per fortuna trovato una soluzione (non è un bello, ma funziona):

quando è necessario aggiornare schede:

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

Questa è una leggera modifica al codice @Kalpit. Dovrai aggiungere dinamicamente questa nuova scheda al nostro layout e assegnare il titolo chiamando lo stesso metodo dall'adattatore chiamato da tablayout quando usi il metodo setupWithViewPager. Quindi ho usato questa istruzione try catch per le schede che non sono ancora state create ancora, ma potresti provare ad assegnare loro un titolo.

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