扫码关注官方订阅号
走同样的路,发现不同的人生
检查你的数据定义,这种做法是非常危险的。我们要确保每个group item都有一个对应的child list,这个list为空,代表该group item没有子条目。可是你的定义呢?如果删除了"second",那么“thrid”到底是group1,还是group2的child呢?从代码中细究:
private String [] groupStr={"第一组","第二组","第三组"}; private String [] childStr={"first","second","third"}; private List<Map<String, String>> groupData = new ArrayList<Map<String, String>>(); private List<Map<String, String>> childData = new ArrayList<Map<String, String>>(); @Override public int getChildrenCount(int arg0) { // 这里的arg0,代表groupPosition, // 所以,如果你删除了某个child元素,必然导致你的childData和groupData数量不对等。 // 当adapter试图为group2调用这个方法时,崩溃。 return childData.get(arg0).size(); } @Override public Object getChild(int arg0, int arg1) { return childData.get(arg0); // arg0代表groupPosition,arg1代表childPosition, // 建议你把这两个参数名称从arg*改成有意义的名字。 // 修改了childData的定义后,这里需要改写成: return childData.get(arg0).get(arg1); }
那么,正确的数据定义和adapter数据初始化应该怎么做呢?看adapter的构造器:
public SimpleExpandableListAdapter( List<? extends Map<String, ?>> groupData, List<? extends List<? extends Map<String, ?>>> childData) {}
(1) 应该像这样定义child data:List<? extends List<? extends Map<String, ?>>>
List<? extends List<? extends Map<String, ?>>>
private List createChildLists(int groupCount) { ArrayList result = new ArrayList(); for( int i = 0 ; i < groupCount ; i++ ) { ArrayList secList = new ArrayList(); for( int n = 0 ; n < 3 ; n++ ) { HashMap child = new HashMap(); child.put( "Sub Item", "Sub Item " + n ); secList.add( child ); } result.add( secList ); } return result; }
(2) 然后这样删除child item:
List<Map<String, String>> childList = (List<Map<String, String>>)childData.get(groupPosition); childList.remove(childPosition)
(3) 再然后 notifyDataSetChanged 通知adapter刷新View。
notifyDataSetChanged
删除数组里对应的值,然后调用MyAdapter.notifyDataSetChanged()
好好好# title
微信扫码关注PHP中文网服务号
QQ扫码加入技术交流群
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
PHP学习
技术支持
返回顶部
检查你的数据定义,这种做法是非常危险的。我们要确保每个group item都有一个对应的child list,这个list为空,代表该group item没有子条目。
可是你的定义呢?如果删除了"second",那么“thrid”到底是group1,还是group2的child呢?从代码中细究:
那么,正确的数据定义和adapter数据初始化应该怎么做呢?看adapter的构造器:
(1) 应该像这样定义child data:
List<? extends List<? extends Map<String, ?>>>(2) 然后这样删除child item:
(3) 再然后
notifyDataSetChanged通知adapter刷新View。删除数组里对应的值,然后调用MyAdapter.notifyDataSetChanged()
好好好# title