problema Android ListView aggiornamento
-
25-09-2019 - |
Domanda
sto diventando un problema strano quando rinfrescante mia ListView
, funziona benissimo fino a quando il dispositivo viene ruotato e poi, quando l'aggiornamento di nuovo va completamente vuoto. Questo può essere risolto solo ruotando nuovamente il dispositivo (come è anche aggiornata in onCreate()
), ma poi ogniqualvolta il rinfrescato di nuovo si spegne. persiste problema fino a quando applicazione viene riavviato.
Modifica
Alcuni codice:
private ListView contactlist = null;
private static MatrixCursor matrixcursor = null;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
contactlist = (ListView) findViewById(R.id.contactlist);
if (savedInstanceState == null) {
matrixcursor = new MatrixCursor(new String[] {"_id","name","one","two","three","four"});
} else {
contactlist.setAdapter(new listCursorAdapter(this,matrixcursor));
}
}
Questo funziona bene, ma ogni volta che:
contactlist.setAdapter(new listCursorAdapter(this,matrixcursor));
viene chiamato dopo onCreate()
e dopo che il dispositivo è stato ruotato il ListView
diventa nero.
Soluzione 2
Bene sono riuscito a risolvere il problema facendo contactlist
statica:
private static ListView contactlist = null;
Non ho idea del perché questo ha funzionato (ha appena fatto una prova / errore per un paio d'ore), quindi se qualcuno potrebbe spiegare che sarebbe grande.
Altri suggerimenti
Credo che la vostra MatrixCursor è in realtà nulla. Quando si ruota il telefono come si sa l'attività viene distrutta. Così il fascio savedinstanceState potrebbe non essere nulla, ma il MatixCursor poi non viene reinizializzata. Sì, è statica, ma ho la sensazione che, se per qualche caso non è caricato nella stessa classloader ... bene che statico non sta per essere troppo affidabile.
C'è un metodo che è il più goffamente chiamato:
onRetainNonConfigurationInstance ()
Che credo vi aiuterà a risolvere questo caso. Quindi, se si torna l'istanza MatrixCursor lì, è possibile in una chiamata successiva a onCreate () uso getLastNonConfigurationInstance () per leggere i dati di nuovo fuori. Non è garantito di essere chiamato, quindi sarà ancora bisogno di gestire il caso in cui non si è stato memorizzato Stato. Speriamo che questo aiuta.
private ListView contactlist = null;
private MatrixCursor matrixcursor = null;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
contactlist = (ListView) findViewById(R.id.contactlist);
matrixcursor = (MatrixCursor)getLastNonConfigurationInstance();
if (matrixcursor == null) {
matrixcursor = new MatrixCursor(new String[] {"_id","name","one","two","three","four"});
} else {
contactlist.setAdapter(new listCursorAdapter(this,matrixcursor));
}
}
public MatrixCursor onRetainNonConfigurationInstance() {
return matrixcuror;
}
public MatrixCuror getLastNonConfigurationInstance() {
return (MatrixCursor) super.getLastNonConfigurationInstance();
}