【问题标题】:ListView and BaseAdapter implementation showing duplicate elements显示重复元素的 ListView 和 BaseAdapter 实现
【发布时间】:2014-06-20 06:55:24
【问题描述】:

我有一个由我的自定义 BaseAdapter 实现支持的 ListView,它背后有一个数据库。当我第一次将一个项目插入我的数据库时,一切都很好。但是,当我添加另一个项目时,我的 ListView 突然显示 3 个项目而不是 2 个。如果我添加另一个项目,ListView 更新,突然我看到 5 个项目。当我点击后退按钮并返回上一个活动并再次启动 ListView 活动时,它再次显示正确数量的项目。所以我的 ListView 或我的适配器没有正确更新,但我看不出哪里出了问题。非常感谢您的帮助。

我的代码:

    @Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.goals_main_screen);
    mListView = (ListView) findViewById(R.id.goal_listview);
    customGridAdapter = new CustomGridViewAdapter(this, R.layout.card_grid_item, gridArray);
    customGridAdapter.registerDataSetObserver(new DataSetObserver(){
        @Override
        public void onChanged(){
            retrieveCurrentGoals();
        }
    });
    mListView.setAdapter(customGridAdapter);
    mListView.setOnItemClickListener(new OnItemClickListener(){
        @Override
        public void onItemClick(AdapterView<?> parent, View view,
                int position, long id) {
            goToDetailedGoalView((int) id);
        }
    });
    retrieveCurrentGoals();
}

private void retrieveCurrentGoals(){
    String[] projection = {DatabaseHelper.KEY_ROWID, DatabaseHelper.KEY_GOAL_ID};
    Cursor c = getContentResolver().query(MyContentProvider.CONTENT_URI_USER_GOALS, projection, null, null, null);
    c.moveToFirst();
    for(int i=0; i<c.getCount();i++){
        String [] goalData = getGoalData(c.getInt(1));
        gridArray.add(goalData);
        c.moveToNext();
    }
    c.close();
}

private String[] getGoalData(int id){
    String[] projection = {DatabaseHelper.KEY_GOAL_TITLE, DatabaseHelper.KEY_GOAL_CATEGORY};
    String selection = "_id = " + id;
    Cursor c = getContentResolver().query(MyContentProvider.CONTENT_URI_GOALS, projection, selection, null, null);
    if(c.moveToFirst()){
        String[] data = {"", "", ""};
        data[0] = c.getString(0);
        data[1] = Integer.toString(c.getInt(1));
        data[2] = String.valueOf(id);
        return data;
    }
    c.close();
    return null;
}

private void goToDetailedGoalView(int id){
    Intent i = new Intent(this, GoalCardDetail.class);
    i.putExtra(SharedData.GOAL_ID.getValue(), id);
    startActivityForResult(i, 0);
}

public void toGoalSelectionScreen(View v){
    Intent i = new Intent(this, DisplayCardActivity.class);
    startActivityForResult(i,GO_TO_GOAL_CARD_SCREEN);
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data){
    if(requestCode == GO_TO_GOAL_CARD_SCREEN && resultCode == RESULT_OK){
        System.out.println("ListView holds: " + mListView.getCount());
        customGridAdapter.notifyDataSetChanged();
    }
}

【问题讨论】:

    标签: android android-listview baseadapter


    【解决方案1】:

    在添加新元素之前尝试清除数组

      private void retrieveCurrentGoals(){
         gridArray.clear();
         String[] projection = {DatabaseHelper.KEY_ROWID, DatabaseHelper.KEY_GOAL_ID};
         Cursor c = getContentResolver().query(MyContentProvider.CONTENT_URI_USER_GOALS, projection, null, null, null);
         c.moveToFirst();
         for(int i=0; i<c.getCount();i++){
           String [] goalData = getGoalData(c.getInt(1));
           gridArray.add(goalData);
           c.moveToNext();
         }
        c.close();
       }
    

    正如你所说的第一次它检索完美,但第二次它开始给出重复值。这可能是由于您使用了类变量 gridArray。检查在添加新数据集之前删除所有元素的方法中的第一行

    【讨论】:

    • 啊,这解决了它。谢谢!
    【解决方案2】:

    这可能是因为当您调用retrieveCurrentGoals() 时,您总是读取数据库中的所有行并将它们附加到您的gridArray

    最初您添加了第一项, 第二次你添加了第一个和第二个 等等。

    作为一种可能的解决方案,在设置新数据之前调用arrayListclear 方法

    【讨论】:

      【解决方案3】:

      getGoalData() 中的 Cursor 是否有预期长度(之前的长度 + 1)?

      我强烈建议使用CursorLoader 类并在ActivityFragment 中实现LoaderCallbacks

      【讨论】:

        【解决方案4】:

        您应该在向其中添加数据之前清理您的数组。因为离开并再次进入当前活动或片段将导致每次在您的数组中添加数据,这就是为什么您会获得重复数据。只需在向其添加数据之前清理您的网格数组和目标数据。就是这样。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-09-26
          • 2020-11-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-01-10
          • 1970-01-01
          相关资源
          最近更新 更多