0

2つの画面を持つアプリケーションがあります。最初の画面には、strings.xmlで宣言されたタイトル、日付、グロスの3つの要素で構成される行を持つ映画のListViewがあります。ユーザーは、メニューボタンをクリックして映画を追加するオプションがあり、別の画面に移動します。2番目の画面には、タイトルの日付とグロスに対応する3つの編集テキストがあり、画面1に戻るとすぐにアルファベット順に並べ替えられます。

同様に、ユーザーはコンテキストメニューを表示する行を長押ししてエントリを編集/削除することもできます。編集機能は次のように機能します。

a。)ユーザーがTitanicを長押しして、[編集]を選択します。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);
    }

どうすればこれを修正できますか?

4

1 に答える 1

1

この問題は、delete関数で、最初に結果コレクション( "results.remove(posDelete);")から要素を削除し、数行後に "results.get(info.position)"を呼び出すために発生します。 rootDelete.remove呼び出しのパラメーターをフェッチしますが、これはすでに削除されています。

要素がコレクションの最後の要素である場合、たとえば50番目の要素の場合、「info.position」の値は50です。1つの要素を削除すると、要素の数は49になります。rootDelete.remove行でresults.get(50)は、エラーを生成します。

于 2012-08-21T17:46:55.677 に答える