我正在扩展一个 ExpandableListView 来创建我自己的 ListView ,适配器回调是通过以下方式实现的:
@Override
public int getGroupCount() {
return m_FilteredSites.getSize();
}
@Override
public Object getGroup(int i) {
return m_FilteredSites.get(i);
}
@Override
public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) {
SiteEntity site = (SiteEntity) getGroup(groupPosition);
//more code ....
}
问题是在调用 getGroupCount 和 getGroupView 之间,m_FilteredSites 集合可能会发生变化(由于在我的案例中使用了过滤器)。 有没有办法强制同步或任何其他方法来保持调用之间的数据一致?
最佳答案
你不应该改变 setAdapter()
之外的内部数据罢工>。相反,您可以构建新的适配器,然后使用该方法更改它,一切都会好起来的。
此视频适用于 ListView
, 但它适用于 ExpandableListView
太:Google I/O 2010 - The world of ListView .如果有时间,我觉得值得一看。
已编辑
抱歉,我不记得我是从哪里学到的。我刚刚重新观看了上面的视频,但找不到那一刻。我想notifyDataSetChanged()
当列表中项目的数据发生变化时使用,而不是列表本身。如果我没记错的话,你应该这样做:
public class SampleAdapter extends BaseExpandableListAdapter {
private List<List<String>> mData;
public void updateData(List<List<String>> data) {
mData = data;
notifyDataSetChanged();
}
}
我的意思是你不应该改变 mData
的项目(例如 add()
, remove()
…)。最好建立新列表并将其分配给 mData
像上面的代码。
如果你有一个 content provider , 你可以使用 CursorTreeAdapter
,它会自动为您管理数据集。我强烈建议使用内容提供商。
关于android - ExpandableListView 回调不同步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15131392/