2010-10-06 4 views
0

J'ai un problème avec ListViews. Chaque fois que j'essaie d'ajouter un élément après qu'il a été d'abord montré, mon FC de programme ayant suivant cadre de pileAndroid ListView problème lors de l'actualisation

Thread [<3> main] (Suspended (exception IllegalStateException))  
ListView.layoutChildren() line: 1603  
AbsListView$CheckForTap.run() line: 1827  
ViewRoot(Handler).handleCallback(Message) line: 587  
ViewRoot(Handler).dispatchMessage(Message) line: 92  
Looper.loop() line: 123  
ActivityThread.main(String[]) line: 4363  
Method.invokeNative(Object, Object[], Class, Class[], Class, int, boolean) line: not available [native method]  
Method.invoke(Object, Object...) line: 521  
ZygoteInit$MethodAndArgsCaller.run() line: 860  
ZygoteInit.main(String[]) line: 618  
NativeStart.main(String[]) line: not available [native method]  

La première fois que j'ajouter des articles tout fonctionne bien, mais quand j'ajouter un élément à l'adaptateur après il a d'abord été montré et toucher le ListView sur le périphérique il se bloque.

J'utilise l'adaptateur suivant

public class Adapterclass extends BaseAdapter{ 
//Adapter for Chatview... 

private Context con; 
private int count = 0; 
private List<String>messages; 

@Override 
public int getCount() { 
    return count; 
} 

@Override 
public Object getItem(int position) { 
    return messages.get(position); 
} 

@Override 
public long getItemId(int position) { 
    return position; 
} 

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    TextView txt = new TextView(con); 
    txt.setText(Html.fromHtml(messages.get(position))); 
    return txt; 
} 

public void AddItem(String item){ 
    messages.add(item); 
    count++; 

} 

Adapterclass(Context con){ 
    this.con = con; 
    messages = new ArrayList<String>(); 

} 

}

(Pour ajouter un élément que j'appelle AddItem) Avez-vous des suggestions? Il me rend fou depuis plusieurs heures =/

Répondre

0

Je ne sais pas, mais vous pouvez essayer d'ajouter: à la fin de votre méthode AddItem

notifyDataSetChanged(); 

. Cette méthode permet à l'adaptateur de savoir que les données sous-jacentes ont été modifiées et que les vues doivent être redessinées.

+0

Eh bien, merci pour vos réponses, – Mereep

0

Étendre le ArrayAdapter au lieu du BaseAdapter. Ensuite, utilisez sa fonction add(Object o) où vous utilisez actuellement votre fonction AddItem(). Il devrait gérer la mise à jour de la vue pour vous.

0

Eh bien, merci pour vos réponses.

J'ai essayé de changer en ListAdapter, mais c'était juste le même résultat.

J'ai également appelé notifyDataSetChanged mais cela s'est brisé au moment où je l'ai appelé mon application. Mais Logcat m'a alors dit qu'il s'est écrasé parce qu'il est appelé par le thread il n'a pas été créé. Stackframe n'a pas donné un indice utile aussi

Donc, je suppose, il a aussi des problèmes lors de l'envoi d'un ajout à l'adaptateur qui n'a pas été créé à partir du même fil, ce qui est assez moche et documenté nulle part.

J'ai donc créé un gestionnaire() dans la classe principale pour recevoir des messages du thread et faire la tâche dans son propre contexte et voilá cela a fonctionné. Beaucoup d'heures perdues cause de ne pas obtenir des messages d'erreur correcte et aucun indice dans le guide ... nice