UPDATERimozione di frammenti di FragmentStatePagerAdapter
Dopo un po 'maggiore di combattimento con questo problema e l'aiuto di modo che gli utenti sono riuscito a risolverlo. Ecco come il mio clearProgressUpTo
sembra ora.
public void clearProgressUpTo(int progress) {
boolean deleted = false;
for (int i = fragments.size() - 1; i > 0; i--) {
int key = fragments.keyAt(i);
if (key != progress) {
fragments.delete(key);
deleted = true;
} else {
break;
}
}
if (deleted)
notifyDataSetChanged(); //prevents recursive call (and IllegalStateException: Recursive entry to executePendingTransactions)
while (mSavedState.size() > progress) {
mSavedState.remove(mSavedState.size()-1);
}
}
Il motivo per cui lo sto facendo dopo notifyDataSetChanged
perché il initiateItem
stava riempiendo il mio mSavedState
ancora una volta. E sono sicuro che dopo aver notificato il mio adapter
non possiedo nessuna di queste Fragments
.
Inoltre, se si vuole fare in quel modo cambiare il vostro mSaveState
-protected
in modo da essere in grado di ottenere dalla classe che estende (nel mio caso VerticalAdapter
).
Ho dimenticato di dire che sto usando FragmentStatePagerAdapter fix by Adam Speakman per risolvere il mio problema.
////////////////////////////////////////////// /////// DOMANDA PARTE /////////////////////////////////////// ///////////////
il problema che sto avendo è che ho bisogno di rimuovere completamente alcuni di Fragments
detenuti in FragmentStatePagerAdapter
.
Ho già eseguito la correzione POSITION_NONE
ma i vecchi frammenti sembrano rimanere intatti.
COSTRUZIONE
perché la costruzione di mia ViewPager
è insolito sono stato costretto a mettere Dentro il mio VerticalAdater
estende FragmentStatePagerAdapter
un SparseArray
che contiene tutti i miei frammenti.
public class VerticalAdapter extends FragmentStatePagerAdapter {
private SparseArray<Fragment> fragments = new SparseArray<Fragment>();
...
@Override
public Fragment getItem(int position) {
return getFragmentForPosition(position);
}
@Override
public int getCount() {
return fragments.size();
}
PROBLEMA
ho fatto un metodo specifico incaricato di annullamento di tutta la Fragments
fino a un certo punto della mia FragmentStatePagerAdapter
. Funziona bene ma il problema di cui non posso sbarazzarmi è di azzerare lo ArrayList
all'interno di FragmentStatePagerAdapter
. Anche se svuoto lo SparseArray
, lo ArrayList
di FragmentStatePagerAdapter
che il mio numero VerticalAdapter
è ancora in attesa del Fragments
che non voglio avere lì. Per questo motivo quando creo nuovo Fragments
hanno lo stato di quelli vecchi.
public void clearProgressUpTo(int progress) {
boolean deleted = false;
for (int i = fragments.size() - 1; i > 0; i--) {
int key = fragments.keyAt(i);
if (key != progress) {
fragments.delete(key);
deleted = true;
} else {
break;
}
}
if (deleted)
notifyDataSetChanged(); //prevents recursive call (and IllegalStateException: Recursive entry to executePendingTransactions)
}
Se avete bisogno di più informazioni/codice prego di dirmi nei commenti cercherò di fornire quante più informazioni possibile.
Non ho idea di come risolvere questo problema, quindi qualsiasi input sarebbe apprezzato.
EDIT
Aggiunta richiesto il codice.
private Fragment getFragmentForPosition(int position) {
return fragments.get(getKeyForPosition(position));
}
public int getKeyForPosition(int position) {
int key = 0;
for (int i = 0; i < fragments.size(); i++) {
key = fragments.keyAt(i);
if (i == position) {
return key;
}
}
return key;
}
post 'getFragmentForPosition (posizione);' per favore. – mmlooloo
Aggiunto il codice richiesto. – JakubW
L'unica cosa che manca qui dal mio 'Adatper' è il metodo' setProgress' che riempie l'array 'frammenti'. Perché conosco il suo vecchio stato? Perché 'setProgress' sta ricaricando l'intero array' framments' con 'newinstance' dei miei' Fragments'. Anche gli ID di 'Fragments' all'interno della matrice' ViewPager' sono gli stessi di prima di 'setProgress'. – JakubW