La mise à jour de ExpandableListView avec notifyDataSetChanged()
Tout d'abord une courte aperçu de mon code, je l'espère, de ses compréhensible:
- J'ai une classe appelée
ToDoElement
avec un peu de variables. - J'ai une autre classe appelée
ToDoListe
qui gère leToDoElement
s dans une ArrayList. ToDoListe
contient la méthodedeleteElement()
pour supprimer unToDoElement
à partir de la liste de tableaux- Dans mon activité principale
liste_activity
je créer un objet deToDoListe
et de le remplir avec des Objets deToDoElement
. - Dans la même activité, j'ai un ExpandableListView avec ma propre Carte appelée
expListAdapter
. - L'Adaptateur crée la Groupviews et Childviews en obtenant les variables de Chaîne de la
ToDoElement
s. - J'ai créé un ContextMenu pour chaque Groupe d'items de la liste, dans laquelle j'utilise la méthode
deleteElement()
.
Ok, maintenant c'est ici mon problème:
Après j'ai utilisé la méthode deleteElement()
je veux mettre à jour ma Liste, parce que les données de la liste de tableaux dans ToDoListe
changé. J'appelle donc expListAdapter.notifyDataSetChanged()
.
Mais alors mon ensemble de l'activité de la plante, avec le motif: "IndexOutOfBoundException: Invalid index 4, la taille est de 4" (j'ai eu 5 ToDoELement
éléments dans ma liste, avant la suppression de l'un d'eux).
Je sais que c'est à cause de l'une de mes pour des boucles, mais je n'ai aucune idée de pourquoi.
Fragments de Code:
la création de nouvel Objet de ToDoListe:
private static ToDoListe Liste = new ToDoListe();
classe ToDoListe (juste les méthodes importantes):
public class ToDoListe {
private ArrayList<ToDoElement> ToDoListe;
public ToDoListe()
{
ToDoListe = new ArrayList<ToDoElement>();
}
public void newElement(ToDoElement element){
ToDoListe.add(element);
}
public void deleteElement(int nummer) {
ToDoListe.remove(nummer);
}
public int AnzahlElemente() {
return ToDoListe.size();
}
}
définir la liste de l'Adaptateur:
expListAdapter = new MyListAdapter(this, createGroupList(), createChildList());
setListAdapter( expListAdapter );
créer ArrayLists pour la liste de l'Adaptateur:
//creates the list with the group items
private List createGroupList() {
ArrayList result = new ArrayList();
for (int i=0; i < Liste.AnzahlElemente(); i++) {
result.add(Liste.getElement(i).getUeberschrift());
}
return result;
}
//creates the list with the child items
private List createChildList() {
ArrayList result = new ArrayList();
for(int i=0; i < Liste.AnzahlElemente(); i++) {
ArrayList secList = new ArrayList();
for( int n = 1 ; n <= 3 ; n++ ) {
if (Liste.getElement(i).getStichpunkt(n).length() != 0){
secList.add( "- " + Liste.getElement(i).getStichpunkt(n));
}
}
result.add( secList );
}
return result;
}
ma propre Liste de l'Adaptateur (juste les méthodes importantes):
public class MyListAdapter extends BaseExpandableListAdapter{
private ArrayList<String> ueberschriften;
private ArrayList<ArrayList<String>> stichpunkte;
private LayoutInflater inflater;
public MyListAdapter(Context context, List _ueberschriften, List _stichpunkte) {
this.ueberschriften = (ArrayList)_ueberschriften;
this.stichpunkte = (ArrayList)_stichpunkte;
inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) {
if (convertView == null) {
convertView = inflater.inflate(R.layout.item_child, null);
}
TextView tv = (TextView) convertView.findViewById(R.id.item_child_title);
tv.setText(liste_activity.getListe().getElement(groupPosition).getStichpunkt(childPosition));
return convertView;
}
public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) {
if (convertView == null) {
convertView = inflater.inflate(R.layout.item_group, null);
}
TextView tv = (TextView)convertView.findViewById(R.id.item_group_title);
tv.setText(liste_activity.getListe().getElement(groupPosition).getUeberschrift());
return convertView;
}
utilisation de notifyDataSetChanged():
Liste.deleteElement(groupPos);
expListAdapter.notifyDataSetChanged();
Merci beaucoup pour votre attention!!
OriginalL'auteur OnClickListener | 2012-02-13
Vous devez vous connecter pour publier un commentaire.
Vous avez besoin d'ajouter un
DeleteMethod
de quelque sorte pour leAdapter
et supprimer l'élément de laAdapter
manuellement, non seulement supprimer de laList
.Chaque fois que vous actualisez la vue à l'aide de
notifyDataSetChanged()
laAdapter
va appeler la boucle autour de laList
. VotreList
dans leAdapter
obtient une valeur null à la suite des modifications que vous avez apportées.ok, j'ai tout compris, ça fonctionne! Voici mon code pour la Méthode de Suppression dans mon ListAdapter:
public void deleteItem (int nummer){
stichpunkte.remove(nummer);
ueberschriften.remove(nummer);
}
et ce est la façon dont je l'utilise dans mon activité principale:
Liste.deleteElement(groupPos);
expListAdapter.deleteItem(groupPos);
expListAdapter.notifyDataSetChanged();
OriginalL'auteur daigoor
Appel super dans votre registerDataSetObserver meke notifyDataSetChanged() fonctionne bien.
OriginalL'auteur LenaYan
Vous devriez appeler
expListAdapter.notifyDataSetInvalidated()
expListAdapter.notifyDataSetChanged()
vais mettre à jour votre point de vue pour les nouvelles valeurs pour chacun de ces éléments (pas de changement dans l'un quelconque des éléments)je.e il sera de nouveau appel à votre
getChildView
etgetGroupView
pour chaque élément.OriginalL'auteur Vivek Khandelwal