riordinare le pagine in FragmentStatePagerAdapter utilizzando getItemPosition (Object object)

Credo che FragmentStatePagerAdapter non si comporti correttamente quando getItemPosition(Object object) allo scopo di riordinare le pagine.

Sotto è un semplice esempio. Nello stato iniziale, l'ordine delle pagine è {A, B, C}. Quando richiama toggleState() , l'ordine delle pagine cambia in {A, C, B}. getItemPosition(Object object) , assicuriamo che la pagina corrente che viene visualizzata (A, B o C) non cambia.

  • Come posso caricare una pagina web all'interno del webview di phonegap?
  • Come fuggire% in String.Format?
  • Riempimento / margine di Android ViewPager tra i frammenti di pagina
  • Errore: causa: com.android.sdklib.repository.FullRevision
  • Android libgdx riesce a scorrere il rilevamento sinistro e destro usando l'ascoltatore di gesti
  • null keyevent e actionid = 0 in onEditorAction () (Jelly Bean / Nexus 7)
  •  public static class TestPagerAdapter extends FragmentStatePagerAdapter { private boolean mState = true; public TestPagerAdapter(FragmentManager fragmentManager) { super(fragmentManager); } @Override public int getCount() { return 3; } private void toggleState() { mState = !mState; notifyDataSetChanged(); } private String getLabel(int position) { switch (position) { case 0: return "A"; case 1: return mState ? "B" : "C"; default: return mState ? "C" : "B"; } } @Override public int getItemPosition(Object object) { String label = ((TestFragment) object).getLabel(); if (label.equals("A")) { return 0; } else if (label.equals("B")) { return mState ? 1 : 2; } else { return mState ? 2 : 1; } } @Override public CharSequence getPageTitle(int position) { return getLabel(position); } @Override public Fragment getItem(int position) { return TestFragment.newInstance(getLabel(position)); } } 

    Ho incontrato due comportmenti distinti che sembrano errati.

    1. Se richiesto immediatamente a toggleState() (durante la visualizzazione della pagina A, prima di spostarti in un'altra pagina), l'applicazione si blocca.

       java.lang.IndexOutOfBoundsException: Invalid index 2, size is 2 at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:251) at java.util.ArrayList.set(ArrayList.java:477) at android.support.v4.app.FragmentStatePagerAdapter.destroyItem(FragmentStatePagerAdapter.java:136) at android.support.v4.view.ViewPager.populate(ViewPager.java:867) at android.support.v4.view.ViewPager.setCurrentItemInternal(ViewPager.java:469) at android.support.v4.view.ViewPager.setCurrentItemInternal(ViewPager.java:441) at android.support.v4.view.ViewPager.dataSetChanged(ViewPager.java:766) at android.support.v4.view.ViewPager$PagerObserver.onChanged(ViewPager.java:2519) at android.database.DataSetObservable.notifyChanged(DataSetObservable.java:37) at android.support.v4.view.PagerAdapter.notifyDataSetChanged(PagerAdapter.java:276) at com.ugglynoodle.test.testfragmentstatepageradapter.MainActivity$TestPagerAdapter.toggleState(MainActivity.java:55) ... 

      Guardando l'origine di FragmentStatePagerAdapter , questo verrà risolto verificando prima la dimensione di mFragments (come nelle righe 113-115) prima di call set() nella row 136.

    2. Se per prima cosa spingo a pagina B, viene chiamato getItem(2) , viene creata la pagina C e mFragments ora ha una dimensione di 3 (questo impedirà che il crash precedente si verifichi in un momento). Poi passai indietro alla pagina A e la pagina C viene distrutta, come dovrebbe essere (poiché è di 2 pagine di distanza e sto usando il limite di pagina offscreen predefinito di 1). Ora, chiamo toggleState() . La pagina B è ora distrutta. Tuttavia, la pagina C NON è ricreata! Ciò significa che, quando faccio una svolta a destra, ottengo una pagina vuota.

    In primo luogo, sarebbe bello sapere se sono corretto e questi sono in realtà bug, o se sto facendo qualcosa di sbagliato. Se sono bug, chiunque può suggerire una soluzione (diversa da eseguire il debug e ribuild la libreria di supporto)? Sicuramente qualcuno deve aver superato con getItemPosition(Object object) (oltre a impostare tutto su POSITION_NONE )?

    Sto utilizzando la revisione corrente (10) della libreria di supporto.

  • Emulazione scheda NFC Android
  • Ottieni l'elenco delle applicazioni recenti e in esecuzione non processi
  • esplorare i dati nel database Android SQLite
  • Creazione di ImageButton a forma irregolare con diversi stati di clic
  • Principiante di Android: toccare gli events in android gridview
  • Imansible avviare AVD nell'emulatore Android Studio
  • 2 Solutions collect form web for “riordinare le pagine in FragmentStatePagerAdapter utilizzando getItemPosition (Object object)”

    Guardando l'origine di FragmentStatePagerAdapter, ho capito esattamente che cosa sta andando male. Il FragmentStatePagerAdapter memorizza i frammenti e gli stati salvati in ArrayLists: mFragments e mSavedState . Ma quando i frammenti vengono riordinati, non esiste alcun meccanismo per riordinare gli elementi di mFragments e mSavedState . Pertanto, l'adattatore fornirà frammenti errati al pager.

    Ho presentato un problema per questo e ho allegato un'implementazione fissa (NewFragmentStatePagerAdapter.java) al problema. Nella correzione, ho aggiunto una function getItemId() a FragmentStatePagerAdapter. (Questo rispecchia l'implementazione di riordino in FragmentPagerAdapter.) Una matrix dell'elemento itemId per posizione dell'adattatore viene sempre memorizzata. Quindi, in notifyDataSetChanged() , l'adattatore controlla se l'arrays itemIds è cambiato. Se è presente, allora mFragments e mSavedState vengono riordinati di conseguenza. Ulteriori modifiche possono essere trovate in destroyItem() , saveState() e restoreState() .

    Per utilizzare questa class, getItemPosition() e getItemId() devono essere implementati in modo coerente con getItem() .

    Per me ho lavorato una delle risposte di un problema . Risposte # 20 # 21. Link alla soluzione https://gist.github.com/ypresto/8c13cb88a0973d071a64 . La soluzione migliore, funziona per l'aggiornamento delle pagine e anche il riordino. Solo in questa soluzione l'adattatore non ha lanciato IndexOutOfBoundsExeption quando distrugge l'elemento (in metodo destroyItem), che è noto bug per altre soluzioni.

    L'Android è un fan Android di Google, tutto su telefoni Android, Android Wear, Android Dev e applicazioni Android Games e così via.