ListView中删除行时IndexOutOfBounds错误:安卓(Android: IndexO

2019-11-01 01:06发布

我有一个有2个屏幕的应用程序。 第一个屏幕上有电影与由3元一排的ListView:标题,日期和总值(GDP)的strings.xml声明。 用户必须通过点击菜单按钮,送他到另一个屏幕加入了影片的选项。 第二个屏幕具有对应于标题日期和Gross,这是按字母顺序排序,当它返回到屏幕1直线距离3个编辑文本。

同样,用户也可以编辑/长点击一行thatbrings了上下文菜单中删除条目。 编辑功能的工作原理是这样的:

一个。)用户长点击泰坦尼克并选择编辑湾)行被删除,并且用户被带到屏幕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();

填充ListView控件:

  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);
    }

我该如何解决这个问题?

Answer 1:

发生此问题,因为在你删除功能,您可以先解除的结果集合的元素(“results.remove(posDelete)”),然后,几行后,你所说的“results.get(info.position)”获取的rootDelete.remove调用的参数,但它已被移除。

如果该元素是您收藏的最后一个元素,比方说50元,对于“info.position”值50元。你删除一个元素,所以现在49元素的数量是在你拨打rootDelete.remove线results.get(50),其产生错误。



文章来源: Android: IndexOutOfBounds Error when deleting row in ListView