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.

Foi útil?

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();
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top