组扩展后动态填充可扩展列表视图

Populate dynamically expandablelistview, after expansion of group

我有一个 expandablelistview 的问题,我已经为它实现了一个简单的 BaseExpandableListAdapter 适配器,正如许多在线教程所说的那样。

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

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

换句话说,我在适配器的构造函数中初始化的 namesCollections(如下)似乎为空:

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

如何在组扩展时填充子项?

如果您尝试在点击后添加支持数据,这意味着您尝试获取其大小的此集合为空或零。大多数可能为 null,因为这是您获取空指针的地方。您不能对空引用调用 .size()

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

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

同时确保在添加支持数据时调用 notifyDataSetHasChanged(),以便重建视图。

关于您的性能问题:ExpandableListView 不会为 children 创建视图(因此不会为它们查询数据——即 getChildView() 方法不会被调用)直到child 的组展开,列表视图滚动,这样 child 就会显示在屏幕上。现在,如果您在开始时而不是动态地获取所有数据,您仍然需要为拥有一组完整的支持数据而付出性能损失。因此,有理由动态获取数据,但 ELV 不会浪费任何时间查询支持数据或为尚未显示的 children 构建视图。