【问题标题】:Android: IndexOutOfBounds Error when deleting row in ListViewAndroid:在 ListView 中删除行时出现 IndexOutOfBounds 错误
【发布时间】:2012-08-17 00:42:40
【问题描述】:

我有一个有 2 个屏幕的应用程序。第一个屏幕有一个电影列表视图,其中一行包含 3 个元素:在 strings.xml 中声明的 Title、Date 和 Gross。用户可以选择通过单击菜单按钮来添加电影,这会将他发送到另一个屏幕。第二个屏幕有3个Edit文本,分别对应Title Date和Gross,返回屏幕1时立即按字母顺序排序。

同样,用户也可以通过长按弹出上下文菜单的行来编辑/删除条目。编辑功能是这样工作的:

a.) 用户长按泰坦尼克号并选择编辑 b.) 行被删除,用户被带到屏幕 2 c.) 编辑文本由已删除行中的初始数据填充 d.) 当用户编辑数据时,新电影被添加到 ListView 的底部。

当用户在 ListView 的底部删除这个新电影时,就会出现问题。 Logcat 给出了一个

   java.lang.IndexOutOfBoundsException: Invalid index 50, size is 50

这是我的代码(注意我使用 Perst 来保存数据,但我认为这对我的问题并不重要):

       case R.id.contextedit:
            Lab9_082588FetchDetails row = (Lab9_082588FetchDetails)    getListView()
                    .getItemAtPosition(info.position);
            Intent editData = new Intent(MovieList.this,    Lab9_082588Edit.class);
        String startTitle = row.getTitle();
        String startGross = row.getGross();
        String startDate = row.getDate();

        editData.putExtra(Lab9_082588Edit.TITLE_STRING, startTitle);
        editData.putExtra(Lab9_082588Edit.GROSS_STRING, startGross);
        editData.putExtra(Lab9_082588Edit.DATE_STRING, startDate);
        startActivityForResult(editData, MovieList.EDIT_MOVIE);

        int posEdit = info.position;
        String editTitle = results.get(info.position).getTitle();
        results.remove(posEdit);
        adapter.notifyDataSetChanged();

                    //Perst
        Index<Lab9_082588FetchDetails> rootEdit = (Index<Lab9_082588FetchDetails>) db
                .getRoot();
        rootEdit.remove(editTitle, results.get((int) info.id));
        db.setRoot(rootEdit);

        return true;

编辑类:

       @Override
public boolean onOptionsItemSelected(MenuItem item) {
    // Handle item selection using item.getItemId()
    switch (item.getItemId()) {
    case R.id.edit:
        next();
        break;
    }
    return true;
}

private void next() {
    // TODO Auto-generated method stub
    EditText movieTitle = (EditText) findViewById(R.id.etTitle);
    EditText movieGross = (EditText) findViewById(R.id.etGross);
    EditText movieDate = (EditText) findViewById(R.id.etDate);

    String title = movieTitle.getText().toString();
    String gross = movieGross.getText().toString();
    String date = movieDate.getText().toString();

    if ((title.length() > 0) && (gross.length() > 0)
            && (date.length() == 4)) {

        Intent hobby = getIntent();
        hobby.putExtra(Lab9_082588Edit.TITLE_STRING, title);
        hobby.putExtra(Lab9_082588Edit.GROSS_STRING, gross);
        hobby.putExtra(Lab9_082588Edit.DATE_STRING, date);
        setResult(RESULT_OK, hobby);
        finish();
    }
}

删除函数:

             int posDelete = info.position;
                                String deleteTitle = results.get(
                                        info.position).getTitle();
                                results.remove(posDelete);
                                adapter.notifyDataSetChanged();

                                  Index<Lab9_082588FetchDetails> rootDelete = (Index<Lab9_082588FetchDetails>) db
                                        .getRoot();
                                rootDelete.remove(deleteTitle,
                                        results.get(info.position));
                                db.setRoot(rootDelete); //Perst

                                return;

OnActivityResult(编辑):

         case EDIT_MOVIE:
            Lab9_082588FetchDetails edittedMovie = new Lab9_082588FetchDetails();
            NumberFormat formatterEdit = new DecimalFormat("###,###,###");

            edittedMovie.setTitle(data
                    .getStringExtra(Lab9_082588Add.TITLE_STRING));
            edittedMovie.setGross("$"
                    + formatterEdit.format(Double.parseDouble(data
                            .getStringExtra(Lab9_082588Add.GROSS_STRING))));
            edittedMovie.setDate(data
                    .getStringExtra(Lab9_082588Add.DATE_STRING));

            results.add(edittedMovie);
            adapter.notifyDataSetChanged();

填充列表视图:

  for (int i = 0; i < items.size(); i++) {
        Lab9_082588FetchDetails sr = new Lab9_082588FetchDetails();
        sr.setTitle(items.get(i).getTitle());
        sr.setGross(items.get(i).getGross());
        sr.setDate(items.get(i).getDate());
        results.add(sr);
        Collections.sort(results, ignoreCaseStart);
    }

我该如何补救?

【问题讨论】:

  • 似乎你从 0 开始索引的地方(或)你正在做
  • 我不完全确定我理解。我将发布代码的循环部分
  • IndexOutOfBoundsException 引用了什么代码?例如。它表明它发生在哪一行?你在哪里调用delete 函数?
  • @Roddy 在“rootDelete.remove(deleteTitle, results.get(info.position));”删除功能的一部分
  • @Roddy 当我单击上下文菜单中的删除按钮时,我调用了删除函数。它在 switch 语句中。

标签: java android arrays listview indexoutofboundsexception


【解决方案1】:

出现此问题是因为在您的删除函数中,您首先从结果集合中删除元素(“results.remove(posDelete);”),然后在几行之后调用“results.get(info. position)" 以获取 rootDelete.remove 调用的参数,但该参数已被删除。

如果元素是集合的最后一个元素,假设是第 50 个元素,“info.position”的值为 50。您删除了一个元素,因此元素数现在为 49。在 rootDelete.remove您调用 results.get(50) 的行,这会产生错误。

【讨论】:

  • 我明白了。当我把 results.remove(posDelete);在“rootDelete.remove(deleteTitle, results.get(info.position));”之后线。非常感谢 Integrating Stuff 先生!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多