我的课程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
也不会填充数据。 Category
和Product
都是Serializable
。为什么不填充?
答案 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];
}
}