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.

È stato utile?

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();
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top