Autore Topic: IndexOutOfBoundException in PagerAdapter  (Letto 550 volte)

Offline emaborsa

  • Utente normale
  • ***
  • Post: 274
  • Java Developer
  • Respect: +33
    • Google+
    • emaborsa
    • Mostra profilo
    • www.emaborsa.com
  • Dispositivo Android:
    Samsung Galaxy S2
  • Sistema operativo:
    Linux 10 - Win8.1 - Android 4.1.2
IndexOutOfBoundException in PagerAdapter
« il: 08 Gennaio 2016, 23:54:05 CET »
0
Ho scritto un applicazione.
Ho fatto alcuni test e mi sembra sia OK.
In poche parole ho una MainActivity che implementa OnPageChangeListener per operare su un PagerAdapter dove troviamo il seguente codice:

Codice (Java): [Seleziona]
@Override
public Object instantiateItem(ViewGroup container, int position) {
        int resId = getHelper(position).getCinema().getMainActivityId();
        RelativeLayout rl = holders.get(resId);
        if (rl == null) {
                rl = (RelativeLayout) inflater.inflate(resId, container, false);
                helpers.get(position).initHelper(rl);
                container.addView(rl, position);
        }
        return rl;
}
...che non fa altro che inizializzare il layout di ogni pagina, e giocandoci alcuni minuti funziona senza problemi, anche uscendo e rientrando.

Siccome l'ho fatta in tedesco ed in italiano, spesso cambio lingua per fare delle prove, ed ho notato il seguente problema facendo:

- Apro l'applicazione
- torno alla home del telefono con il tasto home (non con indietro), in modo che l'activity rimane attiva ma in background.
- vado nelle impostazioni del telefono e cambio lingua
- ritornando nella mia applicazione viene sollevata l'eccezione:
Codice (XML): [Seleziona]
01-08 23:41:06.415: E/AndroidRuntime(20475): FATAL EXCEPTION: main
01-08 23:41:06.415: E/AndroidRuntime(20475): java.lang.IndexOutOfBoundsException: index=3 count=0
01-08 23:41:06.415: E/AndroidRuntime(20475):    at android.view.ViewGroup.addInArray(ViewGroup.java:3703)
01-08 23:41:06.415: E/AndroidRuntime(20475):    at android.view.ViewGroup.addViewInner(ViewGroup.java:3642)
01-08 23:41:06.415: E/AndroidRuntime(20475):    at android.view.ViewGroup.addViewInLayout(ViewGroup.java:3596)
01-08 23:41:06.415: E/AndroidRuntime(20475):    at android.view.ViewGroup.addViewInLayout(ViewGroup.java:3577)
01-08 23:41:06.415: E/AndroidRuntime(20475):    at android.support.v4.view.ViewPager.addView(ViewPager.java:1307)
01-08 23:41:06.415: E/AndroidRuntime(20475):    at android.view.ViewGroup.addView(ViewGroup.java:3436)
01-08 23:41:06.415: E/AndroidRuntime(20475):    at com.emaborsa.movies.bz.adapter.MoviesPageAdapter.instantiateItem(MoviesPageAdapter.java:49)
......

è come se il pager fosse nuovamente inizializzato con le pagine a zero, nonostante nel codice abbia:

Codice (Java): [Seleziona]
@Override
public int getCount() {
        return helpers.size();//che per via del costruttore dovrebbe essere 4
}

e provato anche con:
Codice (Java): [Seleziona]
@Override
public int getCount() {
        return 4;
}

Che dite? Bug?

Offline Nicola_D

  • Moderatore
  • Utente storico
  • *****
  • Post: 2479
  • SBAGLIATO!
  • Respect: +323
    • Github
    • Google+
    • nicoladorigatti
    • Mostra profilo
  • Dispositivo Android:
    Nexus 6p, Nexus 4, Nexus S, Nexus 7(2012)
  • Sistema operativo:
    Windows 7
Re:IndexOutOfBoundException in PagerAdapter
« Risposta #1 il: 11 Gennaio 2016, 08:54:36 CET »
0
probabile che helpers venga ri-creato al rientro nell'activity. Dovresti postare più codice per aiutarti, ma controlla, mettiti un breakpoint dove fai un "new" per la variabile helpers, vedrai che la colpa è "tua" :D
IMPORTANTE:NON RISPONDO A PROBLEMI VIA MESSAGGIO PRIVATO
LOGCAT: Non sai cos'è? -> Android Debug Bridge | Android Developers
               Dov'è in Eclipse? -> Window -> Open Prospective -> DDMS e guarda in basso!
[Obbligatorio] Logcat, questo sconosciuto! (Gruppo AndDev.it LOGTFO) - Android Developers Italia

Offline emaborsa

  • Utente normale
  • ***
  • Post: 274
  • Java Developer
  • Respect: +33
    • Google+
    • emaborsa
    • Mostra profilo
    • www.emaborsa.com
  • Dispositivo Android:
    Samsung Galaxy S2
  • Sistema operativo:
    Linux 10 - Win8.1 - Android 4.1.2
Re:IndexOutOfBoundException in PagerAdapter
« Risposta #2 il: 11 Gennaio 2016, 10:21:07 CET »
0
Il costruttore (l'unico della classe):

Codice (Java): [Seleziona]
public MoviesPageAdapter(Activity activity, SparseArray<IActivityHelper> helpers) {
        this.helpers = helpers;
        this.inflater = LayoutInflater.from(activity);
}


Non è da ieri che programmo  o_O

Offline Nicola_D

  • Moderatore
  • Utente storico
  • *****
  • Post: 2479
  • SBAGLIATO!
  • Respect: +323
    • Github
    • Google+
    • nicoladorigatti
    • Mostra profilo
  • Dispositivo Android:
    Nexus 6p, Nexus 4, Nexus S, Nexus 7(2012)
  • Sistema operativo:
    Windows 7
Re:IndexOutOfBoundException in PagerAdapter
« Risposta #3 il: 14 Gennaio 2016, 10:05:54 CET »
0
Non ho detto questo, però quando cambi lingua la tua activity riceve un po di eventi che ne modificano il lifecycle. Se helpers viene ricreato o messo a null perchè l'oggetto è riciclato, può essere che hai un re-create della lista, che però non viene riempita di nuovo con gli elementi di prima! il codice postato è troppo poco per capirci di più ma sono abbastanza sicuro che se vai di debugger scopri che il problema è proprio che la tua lista viene ricreata ;)

Il costruttore (l'unico della classe):

Codice (Java): [Seleziona]
public MoviesPageAdapter(Activity activity, SparseArray<IActivityHelper> helpers) {
        this.helpers = helpers;
        this.inflater = LayoutInflater.from(activity);
}


Non è da ieri che programmo  o_O
IMPORTANTE:NON RISPONDO A PROBLEMI VIA MESSAGGIO PRIVATO
LOGCAT: Non sai cos'è? -> Android Debug Bridge | Android Developers
               Dov'è in Eclipse? -> Window -> Open Prospective -> DDMS e guarda in basso!
[Obbligatorio] Logcat, questo sconosciuto! (Gruppo AndDev.it LOGTFO) - Android Developers Italia

Offline spectrumIg

  • Nuovo arrivato
  • *
  • Post: 6
  • Respect: 0
    • Mostra profilo
Re:IndexOutOfBoundException in PagerAdapter
« Risposta #4 il: 14 Gennaio 2016, 10:47:02 CET »
0
Non ho detto questo, però quando cambi lingua la tua activity riceve un po di eventi che ne modificano il lifecycle.


In particolare uno di questi e' la Configuration, che se non ricordo male e' un oggetto che viene passato ai metodi del lifecycle e che dovrebbe contenere alcune info generali sulla configurazione della tua app. Se non ricordo male ogni activity dovrebbe avere appunto un metodo onConfigurationChanged.
In piu', un'altro possibile ( possibile perche' appunto il codice e' un po' pochino) e' il tipo di helpers. Gli SparseArray sono ottimi ma non so bene come si comportino nel caso siano passati come dipendenza in una classe che recicla layout e dati come l'adapter.


Offline emaborsa

  • Utente normale
  • ***
  • Post: 274
  • Java Developer
  • Respect: +33
    • Google+
    • emaborsa
    • Mostra profilo
    • www.emaborsa.com
  • Dispositivo Android:
    Samsung Galaxy S2
  • Sistema operativo:
    Linux 10 - Win8.1 - Android 4.1.2
Re:IndexOutOfBoundException in PagerAdapter
« Risposta #5 il: 14 Gennaio 2016, 19:50:18 CET »
0
Ammetto di non essere un esperto in Java, ma se l'activity viene riciclata e io non ho salvato l'adapter, dovrei avere un NullPointer...
Il helper in teoria non può essere a null, dato che l'unico costruttore che c'è è quello con parametri, il che vuol dire che nemmeno via Reflection sarebbe possibile instanziare il mio adapter senza helper...o sbaglio?