2010-10-24 8 views
0

Je reçois un problème étrange lors de l'actualisation de mon ListView, il fonctionne très bien jusqu'à ce que l'appareil est tourné, puis lors de l'actualisation à nouveau, il devient complètement vide. Cela ne peut être corrigé qu'en faisant à nouveau tourner le périphérique (car il est également actualisé en onCreate()), mais à chaque fois qu'il est à nouveau actualisé, il devient vide. Le problème persiste jusqu'à ce que l'application soit redémarrée.Android ListView problème d'actualisation

EDIT:

Certains code:

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)); 
    } 
} 

cela fonctionne bien, mais à chaque fois:

contactlist.setAdapter(new listCursorAdapter(this,matrixcursor)); 

est appelée après onCreate() et après que le dispositif a été tourné le ListView se vide .

+0

Pouvez-vous écrire du code? Il est vraiment difficile de diagnostiquer le problème autrement. – elevine

+0

Ont posté du code. Je ne voulais pas tout mettre comme ce serait ~ 1000 lignes, mais pense que j'ai eu toutes les choses pertinentes – ng93

+0

Avez-vous vérifié la disposition utilisée pour la vue de paysage? Peut-être qu'il y a quelque chose qui ne va pas. –

Répondre

1

Eh bien, je réussi à le réparer en faisant contactlist statique:

private static ListView contactlist = null; 

Je ne sais pas pourquoi cela a fonctionné (juste fait un essai/erreur pendant quelques heures) donc si quelqu'un pourrait expliquer ce serait génial.

1

Je pense que votre MatrixCursor est en fait null. Lorsque vous faites pivoter le téléphone comme vous le savez, l'activité est détruite. Ainsi, le bundle savedinstanceState peut ne pas être nul mais le MatixCursor n'est pas réinitialisé. Oui c'est statique mais j'ai l'impression que si c'est pour un peu de chance ce n'est pas chargé dans le même classloader ... eh bien ce statique ne va pas être trop fiable.

Il existe une méthode qui est le plus maladroitement nommé:

onRetainNonConfigurationInstance()

Ce que je pense vous aider à résoudre ce cas. Ainsi, si vous renvoyez votre instance de MatrixCursor, vous pourrez dans un appel ultérieur à onCreate() utiliser getLastNonConfigurationInstance() pour lire les données. Il n'est pas garanti d'être appelé, vous devrez donc gérer le cas où vous n'avez pas d'état stocké. Espérons que cela aide.

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(); 
} 
+0

merci, mais il ne fonctionne toujours pas. J'ai également essayé d'ajouter matrixcursor = (MatrixCursor) getLastNonConfigurationInstance(); avant contactlist.setAdapter (new listCursorAdapter (this, matrixcursor)); chaque fois qu'il est appelé après onCreate() mais toujours le même problème – ng93