我正在制作应用,其中一部分是在列表视图中添加注释(它是一个简单的膳食计划应用)。我一直在关注Lynda的课程,将其实施到我的项目中(为Android构建笔记应用程序(2013))。
有3个ListViews和3个按钮,当按下一个按钮时,您将转到更新列表视图的文本输入活动。
3个部分 - 早餐,午餐和晚餐都有ListView和Button。该按钮进入文本编辑器,当用户返回该特定部分的ListView时(无论他们点击哪个按钮)都会更新。
当列表视图为空时,我添加了一个显示在列表视图之一的注释,例如“早餐”部分。如果我转到另一个按钮+列表视图,例如午餐部分,我添加了一个注释,我刚刚创建的注释 和 我在早餐部分创建的注释都在该列表视图中。然后当我为晚餐列表视图添加一个条目时,有3个项目,一个来自早餐和午餐,然后是我刚刚输入的那个。
点击按钮时的代码:
//btnMoB = Button Monday Breakfast; btnMoL = Button Monday Lunch, etc
public void onClick(View v){
MealItem meal = MealItem.getNew();
Intent i = new Intent(this, MealEditor.class);
i.putExtra("key", meal.getKey());
i.putExtra("text", meal.getText());
if(v.getId() == R.id.btnMoB){
startActivityForResult(i, 1001);
}else if(v.getId() == R.id.btnMoL){
startActivityForResult(i, 1002);
}else if(v.getId() == R.id.btnMoD){
startActivityForResult(i, 1003);
}
}
返回主页时,ListView会更新。
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if ((requestCode == 1001 || requestCode == 1002 || requestCode == 1003) && resultCode == RESULT_OK){
MealItem meal = new MealItem();
meal.setKey(data.getStringExtra("key"));
meal.setText(data.getStringExtra("text"));
datasource.update(meal);
refreshDisplay(requestCode);
}
}
然后refreshDisplay
:
/* Refresh the Display */
private void refreshDisplay(int code) {
mealsList = datasource.findAll();
ArrayAdapter<MealItem> adapter =
new ArrayAdapter<MealItem>(this, R.layout.list_item_layout, mealsList);
if(code == 1001){
mLBMon.setAdapter(adapter);
}else if (code == 1002){
mLLMon.setAdapter(adapter);
}else if(code == 1003){
mLDMon.setAdapter(adapter);
}
}
所以我想避免重复,我是否必须为每个ListView使用不同的mealList
?如果有人可以指导我朝着正确的方向前进,那将非常有帮助,如果需要,我很乐意提供更多代码。谢谢!
编辑:此外,当我在&#34;早餐&#34; listview然后在&#34;午餐&#34;中的那一个和另一个listview和delete one,未删除的那个出现在所有ListViews中,这里是删除然后刷新的代码: @覆盖 public boolean onContextItemSelected(MenuItem item){
if(item.getItemId() == MENU_DELETE_ID){
MealItem meal = mealsList.get(currentNoteId);
datasource.remove(meal);
refreshDisplay(1001);
refreshDisplay(1002);
refreshDisplay(1003);
}
return super.onContextItemSelected(item);
}
编辑2:以下是数据源类http://pastebin.com/iqrJx6Y5的完整代码以及MealItem类http://pastebin.com/cpRan8jt
这些是在我的代码private MealDataSource datasource; List<MealItem> mealsList;
中与我在问题中的其他代码段相同的文件中初始化的。
答案 0 :(得分:2)
您拥有所有三个列表视图的相同数据源。你正在做mealsList = datasource.findAll();
我认为它会返回所有项目而不管它们的来源。我建议您为每个列表视图创建单独的数据源,或者为每个列表视图过滤一些逻辑来过滤结果。
编辑:将MealDataSource类的构造函数更改为此
public MealDataSource(Context context, int code){
if (code == 1001)
mealPrefs = context.getSharedPreferences(PREFKEY, Context.MODE_PRIVATE);
else if(code == 1002)
mealPrefs = context.getSharedPreferences(PREFKEY1, Context.MODE_PRIVATE);
else if(code == 1003)
mealPrefs = context.getSharedPreferences(PREFKEY2, Context.MODE_PRIVATE);
}
您每餐都使用相同的PREFKEY(实际上是文件名),这意味着您每次都将数据保存到同一个文件