我正在扩展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/