使用OrmLite存储HashMap

时间:2014-05-11 10:36:03

标签: android listview ormlite

我的课程ShoppingList包含以下Map

@DatabaseField(dataType = DataType.SERIALIZABLE)
Map<Category, List<Product>> products;

然后,在Fragment上,我有一个应该显示所有Categories的ListView。因此,我使用以下代码为其设置Adapter

aisles.setAdapter(new ShoppingListEditAdapter(getActivity(), new ArrayList<Category>(mShoppingList.getMap().keySet())));

默认情况下,它应为空。如果我单击一个按钮,会打开一个对话框,然后输入我要创建的新类别或过道的文本。因此,我运行以下代码:

Category category = new Category();
category.setName(editText.getText().toString());
mShoppingList.getMap().put(category, new ArrayList<Product>());
try {
    helper.getShoppingListDao().update(mShoppingList);
    ((BaseAdapter) aisles.getAdapter()).notifyDataSetChanged();
} catch (SQLException e) {
    e.printStackTrace();
}

这应该修改我对此片段的ShoppingList,为Map添加一个类别。但是,即使我为我的适配器调用notifyDatasetChanged()或重新启动应用程序,ListView也不会填充数据。 CategoryProduct都是Serializable。为什么不填充?

1 个答案:

答案 0 :(得分:0)

与我发布的评论一致,这是一个简单的适配器,它将接受Map并将地图的键显示为列表的值。我没有根据实际的项目ID进行测试,但是为了显示将要变异的地图,它似乎有效(即如果地图本身被更改并且调用了notifyDataSetChanged(),它将工作)。我依靠ArrayAdapter来完成繁重的任务并且只是覆盖了我想要的方法。

明显的缺点是我不确定调用keySet()。toArray()是多么昂贵,但我认为这是一个线性时间操作,超出额外的内存使用量。但基本上我不知道解决这个问题的好方法,因为它依赖于将Set设置为某种有序的集合。

    public class MapAdapter<K, V> extends ArrayAdapter<K> {

    private Map<K, V> items;

    public MapAdapter(Context context, int resource, Map<K,V> items) {
        super(context, resource);
        this.items = items;
    }

    @Override
    public int getCount() {
        return items.size();
    }

    @Override
    public K getItem(int position) {
        return ((K []) items.keySet().toArray())[position];
    }

}