Sto provando ad avere lo stesso design view pager + tabs
come PlayStore 5.1.x. Ecco il mio layout:Il primo frammento di ViewPager mostrato è sempre errato con FragmentStatePager
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="center_vertical|center_horizontal"
android:gravity="center_vertical|center_horizontal"
android:orientation="vertical">
<com.astuetz.PagerSlidingTabStrip
android:id="@+id/tabs"
android:layout_width="match_parent"
android:layout_height="50dp"
android:background="@drawable/background_tabs" />
<android.support.v4.view.ViewPager
android:id="@+id/pager"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>
mio adattatore:
public class MainPagerAdapter extends FragmentStatePagerAdapter {
private ArrayList<FakeFragment> fragments;
public MainPagerAdapter(FragmentManager fm) {
super(fm);
// TODO Auto-generated constructor stub
fragments = new ArrayList<FakeFragment>();
}
@Override
public Fragment getItem(int position) {
// TODO Auto-generated method stub
if(position < getCount()) {
FakeFragment fragment = FakeFragment.newInstance(position);
fragments.add(fragment);
}
return fragments.get(position);
}
@Override
public int getCount() {
// TODO Auto-generated method stub
return Category.values().length;
}
@Override
public CharSequence getPageTitle(int position) {
// TODO Auto-generated method stub
return Category.values()[position].getTitle();
}
@Override
public int getItemPosition(Object object) {
// TODO Auto-generated method stub
return POSITION_NONE;
}
}
mie schede e cercapersone stanno dimostrando correttamente! ma ho notato che il primo frammento mostrato nella visualizzazione del cercapersone è sempre lo stesso del secondo. Quindi quando faccio scorrere una volta, due volte e torno alla prima pagina, scopro che il frammento corretto ora viene mostrato !!
Non riesco a capire perché questo comportamento, per favore ho bisogno di alcune spiegazioni.
SOLUZIONE
Il problema era dovuto alla mia definizione FakeFragment.newInstance()
metodo.
private static int position;
public static FakeFragment newInstance(int position) {
// TODO Auto-generated method stub
FakeFragment.position = position;
return new FakeFragment();
}
ho cambiato utilizzando un setArguments(args)
al mio FakeFragment
esempio, e quindi recuperare in onCreate
metodo. Ora tutto funziona bene!
Qualcuno può spiegarmi perché ??
Penso che, in questo modo, il valore della posizione dipenderà interamente dal ciclo di vita del frammento, quindi sarà sempre la posizione prevista, Giusto ??
Sbarazzarsi di 'private ArrayList frammenti' e avere semplicemente' getItem() 'restituisce una nuova istanza del frammento. Il ** punto completo e completo * dietro a 'FragmentStatePagerAdapter' è ** NON ** da conservare su tutti i frammenti in memoria. Se questo è quello che vuoi, allora sbarazzarsi di 'ArrayList ' e cambiare l'adattatore in "FragmentPagerAdapter', piuttosto che in FragmentStatePagerAdapter'. Inoltre, sbarazzarsi di 'getItemPosition()'. [FWIW, qui ci sono una serie di esempi di applicazioni di utilizzo di ViewPager] (https://github.com/commonsguy/cw-omnibus/tree/master/ViewPager). –
CommonsWare
Grazie a @CommonsWare. Ho scelto 'FragmentStatePagerAdapter' perché ho 6 pagine nel mio' ViewPager', in ogni pagina ho un 'GridView' con molti dati da mostrare.Ecco perché volevo usare questo tipo di adattatore, ricreare una pagina o aggiornare il suo contenuto solo se necessario. Ecco perché ho anche provato a sovrascrivere 'getItemPosition'. Questo è possibile con 'FragmentPagerAdapter'? grazie ancora per aver risposto! –
L'implementazione dovrebbe funzionare correttamente in entrambi i casi, l'unica cosa diversa potrebbe essere la velocità. Se il caricamento dei dati è costoso e non è necessario farlo ogni volta che si usa 'FragmentStatePagerAdapter', usare' Fragment.onSaveInstanceState' per memorizzare il set di dati caricato. –