首先简要概述一下我的代码,我希望它是可以理解的:
>我有一个名为TodoElement的类,其中包含一些变量.
>我有另一个名为TodoListe的类,它管理ArrayList中的TodoElements.
> TodoListe包含deleteElement()方法,用于从ArrayList中删除TodoElement
>在我的主要活动Liste_activity中,我创建了一个TodoListe对象,并用TodoElement的一些对象填充它.
>在同一个活动中,我有一个带有我自己的适配器名为explistadapter的ExpandableListVIEw.
>适配器通过获取TodoElements的String变量来创建GroupvIEws和ChildvIEws.
>我为列表中的每个Group项创建了一个ContextMenu,其中我使用deleteElement()方法.
好的,现在这是我的问题:
我使用方法deleteElement()之后我想更新我的List,因为TodoListe中的ArrayList数据发生了变化.所以我调用explistadapter.notifyDataSetChanged().但随后我的整个活动崩溃,原因是:“IndexOutOfBoundException:索引4无效,大小为4”(我的列表中有5个TodoELement项目,在删除其中一个之前).我知道这是因为我的一个for循环,但我不知道为什么.
代码片段:
创建TodoListe的新对象:
private static TodoListe Liste = new TodoListe();
class TodoListe(只是重要的方法):
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(); }}
定义列表适配器:
explistadapter = new Mylistadapter(this, createGroupList(), createChildList());setlistadapter( explistadapter );
为列表适配器创建ArrayLists:
// creates the List with the group itemsprivate 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 itemsprivate 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;}
我自己的List Adapter(只是重要的方法):
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;}
使用notifyDataSetChanged():
Liste.deleteElement(groupPos);explistadapter.notifyDataSetChanged();
非常感谢您的关注!!
解决方法:
您需要将某种类型的DeleteMethod添加到适配器并手动从适配器中删除该项目,而不仅仅是从列表中删除它.
每次使用notifyDataSetChanged()刷新视图时,Adapter都会调用List周围的循环.由于您所做的更改,适配器中的列表将获得空值.
总结以上是内存溢出为你收集整理的android – 使用notifyDataSetChanged()更新ExpandableListView全部内容,希望文章能够帮你解决android – 使用notifyDataSetChanged()更新ExpandableListView所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)