Autore Topic: stato perso al passaggio in landscape (e viceversa)  (Letto 1292 volte)

Offline Trigun

  • Utente normale
  • ***
  • Post: 183
  • Respect: +4
    • Mostra profilo
stato perso al passaggio in landscape (e viceversa)
« il: 02 Giugno 2011, 00:40:15 CEST »
0
ho un problema...
sto facendo un app in cui ho nella visualizzazione normale una lista (A)
quando vado in landscape invece le liste diventano 2 (di cui quella a destra e' sempre la lista A)

il problema e' che io vorrei che se scorro la lista in landscape o in normale quando switcho orientamento la lista mi rimane nella stessa posizione in cui l'ho lasciato..
cercando 1 po' in giro ho visto che l'activity viene distrutta e ricreata ... questo e' un'altro problema poiche' la lista che dovrebbe ricreare sarebbe molto lunga (1000+ righe) e quindi se ogni volta evitasse di caricare la roba dal db sarebbe anche meglio :)

non so se mi son spiegato bene...
cmq
    YouTube
        - ‪androidapp‬‏
 
li ho messo un banale video ... come si puo' notare quando giro il terminale la lista riparte sempre da 0
apparte 1 volta che credo abbia salvato lo stato per un bug :P


Offline Trigun

  • Utente normale
  • ***
  • Post: 183
  • Respect: +4
    • Mostra profilo
Re:stato perso al passaggio in landscape (e viceversa)
« Risposta #2 il: 02 Giugno 2011, 11:59:30 CEST »
0
ah c'era ^^ e dire che l'avevo anche cercato :P
avevo trovato 1 cosa simile anche tramite google in inglese su un'altro sito ma non era spiegato bene ^^ e quindi non avevo capito come fare (parlo del 3° modo)

Offline Trigun

  • Utente normale
  • ***
  • Post: 183
  • Respect: +4
    • Mostra profilo
Re:stato perso al passaggio in landscape (e viceversa)
« Risposta #3 il: 02 Giugno 2011, 12:49:30 CEST »
0
contrariamente a quello che pensavo non son riuscito a risolvere il problema :P

o almeno non tutto il problema...

la creazione dell'adapter per le liste devo farla nell'application giusto? e poi passare alla lista l'adapter gia pronto che deve esser applicato?

perche' se e' cosi' ho un problema con il context...
ovvero nel mio adapter uso :
inflater = LayoutInflater.from(context);
dove context e' l'activity attuale...
come faccio a passargli l'activity se questa non e' stata ancora creata?

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3489
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:stato perso al passaggio in landscape (e viceversa)
« Risposta #4 il: 02 Giugno 2011, 12:52:52 CEST »
0
come faccio a passargli l'activity se questa non e' stata ancora creata?

Basta che nel costruttore del tuo adapter metti un parametro di tipo Context

Offline Trigun

  • Utente normale
  • ***
  • Post: 183
  • Respect: +4
    • Mostra profilo
Re:stato perso al passaggio in landscape (e viceversa)
« Risposta #5 il: 02 Giugno 2011, 12:54:12 CEST »
0
si e' quello che faccio gia :D
il discorso e' che il costruttore lo devo richiamare dentro l'application giusto?
in questo caso non ho ancora il context dell'activity dato che non e' stata ancora creata

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3489
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:stato perso al passaggio in landscape (e viceversa)
« Risposta #6 il: 02 Giugno 2011, 13:00:25 CEST »
0
L'adapter normalmente lo istanzi dentro l'activity che lo usa, non vedo dove sta il problema...

Offline Trigun

  • Utente normale
  • ***
  • Post: 183
  • Respect: +4
    • Mostra profilo
Re:stato perso al passaggio in landscape (e viceversa)
« Risposta #7 il: 02 Giugno 2011, 13:03:07 CEST »
0
e allora non ho capito a che serve usar l'application :)

cioe' usando l'application come faccio a far si che ruotando lo schermo la lista non torni in prima posizione?
io pensavo che mettendo l'adapter nella application avevo in qualche modo risolto questo problema :P
invece la mia supposizione e' sbagliata :P

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3489
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:stato perso al passaggio in landscape (e viceversa)
« Risposta #8 il: 02 Giugno 2011, 13:05:50 CEST »
0
Usa la soluzione 2 ;)

Offline Trigun

  • Utente normale
  • ***
  • Post: 183
  • Respect: +4
    • Mostra profilo
Re:stato perso al passaggio in landscape (e viceversa)
« Risposta #9 il: 02 Giugno 2011, 13:26:36 CEST »
0
neanche con la 2 tendo a risolvere ^^ posto il codice :P

Codice (Java): [Seleziona]
public class ListinoOrdini extends ExpandableListActivity {

        public static Context context;
        MyDatabase db;
        private ListinoExpandleAdapter mAdapter;
        private ListinoAdapter mAdapterList;

        @Override
        public void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                context = this;
                db = MyDatabase.getInstance();
                db.open();

                db.getTodayOrder();

                getView();

                ExpandableListView expandableListView = getExpandableListView();
                int groupCount = expandableListView.getCount();

                for (int i = 0; i < groupCount; i++) {
                        expandableListView.expandGroup(i);
                }

        }
       
    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
        getView();
    }

        private void getView() {
                setContentView(R.layout.main);
                if (mAdapter == null)
                        mAdapter = new ListinoExpandleAdapter();
                setListAdapter(mAdapter);
                registerForContextMenu(getExpandableListView());

                Configuration config = getResources().getConfiguration();

                if (config.orientation == Configuration.ORIENTATION_LANDSCAPE) {
                        if (mAdapterList == null)
                                mAdapterList = new ListinoAdapter();
                        ListView lista = (ListView) findViewById(R.id.menu_list);
                        lista.setAdapter(mAdapterList);
                }
        }

        // db.exportOrder();

        @Override
        protected void onStop() {
                super.onStop();
                db.close();
        }
}

praticamente io vorrei che le 2 liste non si resettino come dal video che ho postato :P

cmq ho testato ora che il metodo oncreate mi viene cmq richiamato nonostante abbia messo la riga sull'xml...
quindi continuo a non capire :)

praticamente quando giro il display parte oncreate e dopo parte onConfigurationChanged...
quindi son andato a peggiorare la situazione :P
« Ultima modifica: 02 Giugno 2011, 13:28:26 CEST da Trigun »

Offline Trigun

  • Utente normale
  • ***
  • Post: 183
  • Respect: +4
    • Mostra profilo
Re:stato perso al passaggio in landscape (e viceversa)
« Risposta #10 il: 03 Giugno 2011, 00:07:54 CEST »
0
mm boh nn ne esco fuori ^^ se qualcuno ha gia fatto 1 cosa del genere con una listview e mi posta il codice mi fa 1 favore :P

Offline Verandi

  • Moderatore
  • Utente normale
  • *****
  • Post: 378
  • Respect: +75
    • Mostra profilo
  • Sistema operativo:
    Windows 7
Re:stato perso al passaggio in landscape (e viceversa)
« Risposta #11 il: 03 Giugno 2011, 01:04:11 CEST »
+1
Hai provato a salvare la posizione con listView.getFirstVisiblePosition() e settarla nella listView con listView.setSelection(int position) quando viene ricreata?

Codice (Java): [Seleziona]
(...)
int position;
  @Override
        public void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
               if (savedInstanceState!=null){
                      position = savedInstanceState.getInt("position");
               }
   //Setti lista e adapter, dopodiché:
   lista.setSelection(position);
 }


       

@Override
public void onSaveInstanceState(Bundle savedInstanceState) {

  savedInstanceState.putInt("position", lista.getFirstVisiblePosition());

  super.onSaveInstanceState(savedInstanceState);
}

Risolve qualcosa?

Offline Trigun

  • Utente normale
  • ***
  • Post: 183
  • Respect: +4
    • Mostra profilo
Re:stato perso al passaggio in landscape (e viceversa)
« Risposta #12 il: 03 Giugno 2011, 06:49:51 CEST »
0
a funzionare funziona... l'unica cosa e' che non mi salva gli eventuali gruppi aperti/chiusi...
quello che viene modificato e' l'adapter giusto ? in questo caso se prendessi tutto l'adapter ogni volta ?

cioe' al momento ho una classe application che praticamente non fa nulla :P
se la usassi per salvare la lista su onSaveIstanceState e caricassi la lista prefatta direttamente?
mi manterrebbe tutto ?

cmq tnx :)
« Ultima modifica: 03 Giugno 2011, 06:52:46 CEST da Trigun »

Offline Verandi

  • Moderatore
  • Utente normale
  • *****
  • Post: 378
  • Respect: +75
    • Mostra profilo
  • Sistema operativo:
    Windows 7
Re:stato perso al passaggio in landscape (e viceversa)
« Risposta #13 il: 03 Giugno 2011, 09:07:29 CEST »
0

quello che viene modificato e' l'adapter giusto ? in questo caso se prendessi tutto l'adapter ogni volta ?

Per farlo, è possibile farlo, ma è molto sconsigliato perché porterebbe a un leak del context. Manterresti una referenza al context dell'activity precedente, impedendo al garbage collector di liberare memoria, portandoti, prima o poi, ad un errore di memoria insufficiente.

Comunque ho trovato questo che dovrebbe salvare anche i gruppi aperti/chiusi.
Codice (Java): [Seleziona]
(...)
private static final String LIST_STATE_KEY = "listState";
private static final String LIST_POSITION_KEY = "listPosition";
private static final String ITEM_POSITION_KEY = "itemPosition";

private Parcelable mListState = null;
private int mListPosition = 0;
private int mItemPosition = 0;
(...)
protected void onRestoreInstanceState(Bundle state) {
    super.onRestoreInstanceState(state);

    // Retrieve list state and list/item positions
    mListState = state.getParcelable(LIST_STATE_KEY);
    mListPosition = state.getInt(LIST_POSITION_KEY);
    mItemPosition = state.getInt(ITEM_POSITION_KEY);
}

protected void onResume() {
    super.onResume();

    // Load data from DB and put it onto the list
    loadData();

    // Restore list state and list/item positions
    ExpandableListView listView = getExpandableListView();
    if (mListState != null)
        listView.onRestoreInstanceState(mListState);
    listView.setSelectionFromTop(mListPosition, mItemPosition);
}

protected void onSaveInstanceState(Bundle state) {
    super.onSaveInstanceState(state);

    // Save list state
    ExpandableListView listView = getExpandableListView();
    mListState = listView.onSaveInstanceState();
    state.putParcelable(LIST_STATE_KEY, mListState);

    // Save position of first visible item
    mListPosition = listView.getFirstVisiblePosition();
    state.putInt(LIST_POSITION_KEY, mListPosition);

    // Save scroll position of item
    View itemView = listView.getChildAt(0);
    mItemPosition = itemView == null ? 0 : itemView.getTop();
    state.putInt(ITEM_POSITION_KEY, mItemPosition);
}

Offline Trigun

  • Utente normale
  • ***
  • Post: 183
  • Respect: +4
    • Mostra profilo
Re:stato perso al passaggio in landscape (e viceversa)
« Risposta #14 il: 03 Giugno 2011, 11:40:12 CEST »
0
si e' vero che manterrei l'activity precedente... ma ne avrei al massimo 2 (quella attuale e quella precedente) o no?
poiche' nel momento in cui salvo lo stato quello vecchio viene buttato poi lo ricarico sulla nuova istanza (e volendo potrei portare subito a null la variabile in modo da fargli liberare la memoria)
o no?

old = null //la variabile e' inizializzata a null
*prima esecuzione del saveistance*
old = getAdapter() (sto andando a memoria non ricordo se e' questa la funzione :P)
*2nd esecuzione* //la variabile contiene il vecchio adapter
old = getAdapter()
//dovrei aver il riferimento dell'adapter dell'ultimo adapter usato e quindi puo' eliminare la n-2 esecuzione dalla memoria?

cmq quella soluzione l'avevo trovata anch'io... ma mi sembra di aver letto che non funzioni bene :)
anche perche' non capisco come faccia ad aprire/chiudere i gruppi



inoltre il mio adapter e' molto grosso... quindi se potessi evitare di ricostruirlo ogni volta sarebbe un miglioramento secondo me...
« Ultima modifica: 03 Giugno 2011, 11:52:38 CEST da Trigun »