3 回答
TA贡献1845条经验 获得超8个赞
看看你的onResume方法ItemFragment:
@Override
public void onResume() {
super.onResume();
items.clear();
items = dbHelper.getItems(); // reload the items from database
adapter.notifyDataSetChanged();
}
你刚刚调用之前更新的notifyDataSetChanged()不是适配器的字段,private List<Item> items;而是片段的相同声明的字段。适配器仍然存储对您在创建适配器时传递的项目列表的引用(例如,在fragment的onCreate中)。最短(在变化的数量意义上)但不是优雅的方式使您的代码按预期运行只是替换行:
items = dbHelper.getItems(); // reload the items from database
同
items.addAll(dbHelper.getItems()); // reload the items from database
更优雅的解决方案:
1)private List<Item> items;从中删除项目ItemFragment- 我们只需要在适配器中继续引用它们
2)将onCreate改为:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
super.setHasOptionsMenu(true);
getActivity().setTitle(TITLE);
dbHelper = new DatabaseHandler(getActivity());
adapter = new ItemAdapter(getActivity(), dbHelper.getItems());
setListAdapter(adapter);
}
3)在ItemAdapter中添加方法:
public void swapItems(List<Item> items) {
this.items = items;
notifyDataSetChanged();
}
4)将你的onResume更改为:
@Override
public void onResume() {
super.onResume();
adapter.swapItems(dbHelper.getItems());
}
TA贡献1900条经验 获得超5个赞
您将重新加载的项目分配给全局变量项目onResume(),但这不会反映在ItemAdapter类中,因为它有自己的实例变量名为“items”。
要刷新ListView,请在ItemAdapter类中添加一个refresh(),该类接受列表数据,即项目
class ItemAdapter
{
.....
public void refresh(List<Item> items)
{
this.items = items;
notifyDataSetChanged();
}
}
onResume()使用以下代码更新
@Override
public void onResume()
{
super.onResume();
items.clear();
items = dbHelper.getItems(); //reload the items from database
**adapter.refresh(items);**
}
TA贡献1834条经验 获得超8个赞
在onResume()中更改此行
items = dbHelper.getItems(); //reload the items from database
至
items.addAll(dbHelper.getItems()); //reload the items from database
问题是你永远不会告诉适配器有关新项目列表的信息。如果您不想将新列表传递给适配器(因为您似乎没有),那么只需items.addAll在您的适配器之后使用clear()。这将确保您修改适配器引用的相同列表。
- 3 回答
- 0 关注
- 726 浏览
添加回答
举报