Android-在ListView中避免重复
我正在制作一个应用程序,其中一部分是在列表视图中添加注释(这是一个简单的膳食计划应用程序)。我一直在学习一门关于Lynda的课程,以便将其应用到我的项目中(为Android构建一个笔记应用程序(2013)) 有3个listview和3个按钮,当按下一个按钮时,您将转到更新listview的文本输入活动 早餐、午餐和晚餐三个部分都有一个列表视图和一个按钮。该按钮转到文本编辑器,当用户返回该特定部分(无论单击哪个按钮)的ListView都会更新 当列表视图为空时,我会添加一个出现在其中一个列表视图中的注释,例如早餐部分。如果我转到另一个按钮+列表视图,例如午餐部分,我添加了一个注释,我刚才创建的注释和我在早餐部分创建的注释都在该列表视图中。然后,当我为晚餐列表视图添加条目时,有3个条目,一个来自早餐和午餐,然后是我刚刚输入的条目 单击按钮时的代码:Android-在ListView中避免重复,android,listview,duplicates,Android,Listview,Duplicates,我正在制作一个应用程序,其中一部分是在列表视图中添加注释(这是一个简单的膳食计划应用程序)。我一直在学习一门关于Lynda的课程,以便将其应用到我的项目中(为Android构建一个笔记应用程序(2013)) 有3个listview和3个按钮,当按下一个按钮时,您将转到更新listview的文本输入活动 早餐、午餐和晚餐三个部分都有一个列表视图和一个按钮。该按钮转到文本编辑器,当用户返回该特定部分(无论单击哪个按钮)的ListView都会更新 当列表视图为空时,我会添加一个出现在其中一个列表视图中
//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);
}
}
返回主页时,列表视图将更新
@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);
}
}
然后刷新显示:
/* 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);
}
}
编辑2:以下是数据源类和MealItem类的完整代码
这些是在my code
private MealDataSource数据源中初始化的;列表-测量列表
与问题中的其他代码片段位于同一文件中。三个ListView的数据源都相同。您正在执行mealsList=datasource.findAll()代码>我认为它返回所有项目,而不管它们的来源。我建议您为每个listview创建单独的数据源,或者为每个listview设置一些逻辑来过滤结果
编辑:将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(实际上是文件名),这意味着您每次对所有三个ListView使用相同的数据源时都将数据保存到相同的文件中。您正在执行mealsList=datasource.findAll()代码>我认为它返回所有项目,而不管它们的来源。我建议您为每个listview创建单独的数据源,或者为每个listview设置一些逻辑来过滤结果
编辑:将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(实际上是文件名),这意味着您每次在同一活动中实现三个ListView时都将数据保存到同一个文件中,对吗?这可能是因为您对所有三个ListView都有相同的数据源。您正在执行mealsList=datasource.findAll()代码>我认为它返回所有项目,而不考虑它们的源。您在同一活动中实现了三个ListView,对吗?这可能是因为您对所有三个ListView都有相同的数据源。您正在执行mealsList=datasource.findAll()
我想它会返回所有的项目,不管它们的来源如何。谢谢你的回复。因此,我应该为每个ListView创建不同的MealDataSource
文件,还是执行datasource=new MealDataSource(此操作);datasource1=新的测量数据源(this)
etc,并通过列表测量列表创建多个测量列表;列出mealsList2
etc,然后对所有人执行.findAll()?在我的帖子中,有一个用于MealDataSource文件和MealItem文件的粘贴箱。是的,这是一种方法,我尝试了第二种方法,制作datasource2,datasource3
和MealList2
,等,但我仍然面临着同样的问题。更改您的onActivityResult代码,使其仅更新与请求代码相关的数据源是的,我使用if语句和2个else if完成了此操作,仍然无法工作感谢您的回复。因此,我应该为每个ListView创建不同的MealDataSource
文件,还是执行datasource=new MealDataSource(此操作);datasource1=新的测量数据源(this)
etc,并通过列表测量列表创建多个测量列表;列出mealsList2
etc,然后对所有人执行.findAll()?在我的帖子中,有一个用于MealDataSource文件和MealItem文件的粘贴箱。是的,这是一种方法,我尝试了第二种方法,制作datasource2,datasource3
和MealList2
,等,但我仍然面临同样的问题。更改您的onActivityResult代码,使其仅更新与请求代码相关的数据源是的,我使用if语句和2个else if进行了更新,但仍然不起作用