Atualizando ExpandableListView com notifyDataSetChanged ()
Primeiro um curtoVisão gera do meu código, espero que seja compreensível:
Tenho uma classe chamadaToDoElement
com algumas variáveis. Tenho outra classe chamadaToDoListe
que gerencia oToDoElement
s em um ArrayList.ToDoListe
contém o métododeleteElement()
para excluir umToDoElement
do ArrayList Na minha atividade principalliste_activity
eu crio um objeto deToDoListe
e preencha-o com alguns objetos deToDoElement
. Na mesma atividade, tenho um ExpandableListView com meu próprio adaptador chamadoexpListAdapter
.O Adaptador cria as visualizações de grupo e de crianças obtendo as variáveis String doToDoElement
s. Criei um ContextMenu para cada item do grupo da lista, no qual uso o métododeleteElement()
. Ok, agora aqui é o meuproblem:
Depois que eu usei o métododeleteElement()
quero atualizar minha lista, porque os dados do ArrayList emToDoListe
mudou. Então eu ligo paraexpListAdapter.notifyDataSetChanged()
.
Mas então toda a minha atividade falha, com o motivo: "IndexOutOfBoundException: índice 4 inválido, tamanho "(Eu tinha 5ToDoELement
itens da minha lista, antes de excluir um deles
Sei que é por causa de um dos meus loops, mas não tenho idéia do porqu
ragmentos @Code:
criar o novo objeto ToDoListe:
private static ToDoListe Liste = new ToDoListe();
class ToDoListe (apenas os métodos 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();
}
}
define list Adaptador:
expListAdapter = new MyListAdapter(this, createGroupList(), createChildList());
setListAdapter( expListAdapter );
criar ArrayLists para o adaptador da lista:
// 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;
}
meu próprio adaptador de lista (apenas os métodos 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;
}
use de notifyDataSetChanged ():
Liste.deleteElement(groupPos);
expListAdapter.notifyDataSetChanged();
Muito obrigado pela sua atenção!