Android ListView Refresh Issue
-
25-09-2019 - |
Pergunta
Estou tendo um problema estranho ao refrescar meu ListView
, ele funciona bem até que o dispositivo seja girado e, ao atualizá -lo novamente, fica completamente em branco. Isso só pode ser corrigido girando o dispositivo novamente (pois também é atualizado em onCreate()
) Mas então sempre que é atualizado novamente, fica em branco. O problema persiste até que o aplicativo seja reiniciado.
EDITAR:
Algum código:
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));
}
}
Isso funciona bem, mas sempre que:
contactlist.setAdapter(new listCursorAdapter(this,matrixcursor));
é chamado depois onCreate()
e depois que o dispositivo foi girado, o ListView
fica em branco.
Solução 2
Bem, eu consegui consertar isso fazendo contactlist
estático:
private static ListView contactlist = null;
Não tenho idéia do porquê disso funcionou (apenas fez uma tentativa/erro por algumas horas), então se alguém pudesse explicar, isso seria ótimo.
Outras dicas
Eu acho que seu matrixcursor é realmente nulo. Quando você gira o telefone como você sabe, a atividade é destruída. Portanto, o pacote SAVEDINSTANCESTATE pode não ser nulo, mas o MatixCursor não é reinicializado. Sim, é estático, mas sinto que, por alguma chance, não estiver carregado no mesmo carregador de classe ... bem, que estática não será muito confiável.
Existe um método que é mais desajeitadamente chamado:
OnretainNonConfigurationInstance ()
O que eu acho que o ajudará a resolver este caso. Portanto, se você retornar sua instância do MatrixCursor lá, poderá em uma chamada posterior para oCreate () usar getLastNonConfigurationInstance () para ler os dados de volta. Não é garantido que você ainda precisará lidar com o caso em que não tem estado armazenado. Espero que isso ajude.
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();
}