2012-11-17 4 views
6

È possibile utilizzare un frammento in un viewpager più volte? Sto cercando di creare un'interfaccia utente aggiornata dinamicamente utilizzando ViewPager. Voglio usare lo stesso design, fondamentalmente lo stesso frammento con dati diversi per ogni pagina, come un adattatore listview.Utilizzare un frammento in un ViewPager più volte

+1

AFAIK, questo non funzionerà. Potresti usare un "GestureDetector" per guardare i colpi sul tuo frammento esistente. – CommonsWare

+0

BTW, per chiarire, presumo che tu intenda che tu voglia usare un singolo frammento * istanza * - se vuoi dire che vuoi usare solo un singolo frammento * classe *, è perfettamente soddisfacente. – CommonsWare

risposta

4

È possibile creare un'istanza della stessa classe Fragment per ogni pagina nel ViewPager, passando la posizione di ViewPager per controllare cosa visualizzare. Qualcosa del genere:

public class MyFragment extends Fragment { 

    private int mIndex; 

    public MyFragment(int index) { 
     mIndex = index; 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
       Bundle savedInstanceState) { 

     switch(mIndex){ 
      case 0: 
      // do you things.. 
      case 1: 
      // etcetera 
     }    
    } 
} 

allora, in te FragmentPagerAdapter:

public static class MyAdapter extends FragmentPagerAdapter { 
    public MyAdapter(FragmentManager fm) { 
     super(fm); 
    } 

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

    @Override 
    public Fragment getItem(int position) { 
     return new MyFragment(position); 
    } 
} 

In questo modo è possibile riutilizzare la maggior parte del codice di cambiare solo quello che serve nella dichiarazione switch/case.

+0

ma non è possibile creare un costruttore non vuoto di classe frammento –

3

Hai frainteso il concetto di class versus object of class. Il codice sorgente MyFragment.java definisce class, che si trasformano in "essere vivente" ogni volta che si un'istanza con new operatore (new MyFragment();) - questo crea object che è un instance del vostro class. A meno che non lo impedisca intenzionalmente (utilizzando cioè il pattern Singleton), puoi creare il numero instances di class come preferisci, nello stesso modo in cui puoi fare tante torte utilizzando un'unica ricetta. E questo vale anche per i frammenti.

Quindi, fintanto che si crea separataobject (aka detto instance) del class per ogni pagina, si dovrebbe essere in grado di fare quello che vuoi.

+0

è possibile fornire qualche esempio per la spiegazione sopra ..? – Harsha