Android - ListView中的重复项避免

时间:2016-02-20 23:38:21

标签: android listview duplicates

我正在制作应用,其中一部分是在列表视图中添加注释(它是一个简单的膳食计划应用)。我一直在关注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;中与我在问题中的其他代码段相同的文件中初始化的。

1 个答案:

答案 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(实际上是文件名),这意味着您每次都将数据保存到同一个文件