android - ExpandableListView 回调不同步

标签 android listview synchronization expandablelistview expandablelistadapter

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

相关文章:

PHP : How can I synchronize one online sql database with another offline database?

android - 退出应用程序后按钮背景更改为默认

c# - 在 WPF 中应用程序启动时应默认选择 ListView 项

android - 启用文本过滤器时如何引用列表项的原始位置?

c# - 是否可以从 listview 获取值并将其转发到 Windows 窗体中的 DataGridView?

Java:什么对象比较合适?

iphone - 核心数据+iCloud : exclude certain attributes from sync?

java - 应使用 PowerManager 唤醒设备多长时间以确保显示使用 BroadcastReceiver 创建的 Activity ?

java - 如何在android中创建我自己的com.google.android.gms.tasks.Task?

java - onclick 取决于 View 所在的位置