Android-在ListView中避免重复

Android-在ListView中避免重复,android,listview,duplicates,Android,Listview,Duplicates,我正在制作一个应用程序,其中一部分是在列表视图中添加注释(这是一个简单的膳食计划应用程序)。我一直在学习一门关于Lynda的课程,以便将其应用到我的项目中(为Android构建一个笔记应用程序(2013)) 有3个listview和3个按钮,当按下一个按钮时,您将转到更新listview的文本输入活动 早餐、午餐和晚餐三个部分都有一个列表视图和一个按钮。该按钮转到文本编辑器,当用户返回该特定部分(无论单击哪个按钮)的ListView都会更新 当列表视图为空时,我会添加一个出现在其中一个列表视图中

我正在制作一个应用程序,其中一部分是在列表视图中添加注释(这是一个简单的膳食计划应用程序)。我一直在学习一门关于Lynda的课程,以便将其应用到我的项目中(为Android构建一个笔记应用程序(2013))

有3个listview和3个按钮,当按下一个按钮时,您将转到更新listview的文本输入活动

早餐、午餐和晚餐三个部分都有一个列表视图和一个按钮。该按钮转到文本编辑器,当用户返回该特定部分(无论单击哪个按钮)的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);
    }
}
返回主页时,列表视图将更新

@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进行了更新,但仍然不起作用