gpt4 book ai didi

java - Android:在 ListView 中删除行时 IndexOutOfBounds 错误

转载 作者:行者123 更新时间:2023-12-01 15:12:59 26 4
gpt4 key购买 nike

我有一个有 2 个屏幕的应用程序。第一个屏幕有一个电影 ListView ,其中一行包含 3 个元素:在 strings.xml 中声明的标题、日期和总金额。用户可以选择通过单击菜单按钮来添加电影,这会将他发送到另一个屏幕。第二个屏幕有 3 个编辑文本,分别对应于“标题日期”和“总金额”,当返回到屏幕 1 时,这些文本会立即按字母顺序排序。

类似地,用户还可以通过长按弹出上下文菜单的行来编辑/删除条目。编辑功能的工作原理如下:

a.) 用户长按泰坦尼克号并选择编辑b.) 行被删除,用户被带到屏幕 2c.) 编辑文本用已删除行中的初始数据填充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);
}

如何解决这个问题?

最佳答案

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

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

关于java - Android:在 ListView 中删除行时 IndexOutOfBounds 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12058775/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com