在扩展组后,动态扩展动态扩展列表视图

时间:2016-09-05 19:07:03

标签: java android nullpointerexception expandablelistview

我有一个expandablelistview的问题,我为它实现了一个简单的BaseExpandableListAdapter适配器,就像很多在线教程所说的那样。

当我同时填充expandablelistview组和子项时,在片段的开头,我没有问题,但是当我尝试在扩展时填充子项(在onGroupClick内)时,我得到一个NullPointerException适配器实现的要点:

public int getChildrenCount(int groupPosition) {
    return namesCollections.get(contactNames.get(groupPosition)).size();
}

我还说我在适配器的构造函数(下面)中初始化的namesCollections看起来是null:

public FavoriteAdapter(Activity context, List<String> contactNames,
                       Map<String, List<String>> namesCollections) {
    this.context = context;
    this.namesCollections = namesCollections;
    this.contactNames = contactNames;
}

如何在扩展群组时填充孩子?

1 个答案:

答案 0 :(得分:0)

如果您在单击后尝试添加后备数据,则表示您尝试获取大小的此集合为null或零。大多数人都是null,因为这是你得到空指针的地方。您无法在空引用上调用.size()

public int getChildrenCount(int groupPosition) {
    return namesCollections.get(contactNames.get(groupPosition)).size();
}

由于此时集合为空,并且您计划稍后添加数据,因此您需要初始化集合并使用虚拟项目填充它(在获取数据时替换它们),或者不使用集合用于确定集合中有多少孩子的大小,因为它不是一个准确的衡量标准。

另外,请务必在添加后备数据时致电notifyDataSetHasChanged(),以便重建视图。

关于您的性能问题:ExpandableListView不会为子项创建视图(因此不会为它们查询数据 - 即不调用getChildView()方法)直到子项为&#39 ; s组被展开,滚动列表视图,以便孩子将显示在屏幕上。现在,如果您在开始时获取所有数据而不是动态地获取所有数据,则仍需要支付性能损失。因此有理由动态获取数据,但是ELV不会浪费任何时间查询支持数据或为孩子构建视图,而这些视图还没有必要显示。