1

映画を含むリストビューがあります。リストはstrings.xmlで宣言されています。ユーザーは、このリストビューにムービーを追加したり、エントリを編集したり、エントリを削除したりできます。

ユーザーが各エントリを強調表示し (つまり、発射矢印を使用し、マウスのトラックボールを使用)、選択したエントリのすぐ下に新しいムービーを挿入できるようにする新しい「挿入」メソッドを実装しています。私の問題は、挿入アクティビティから setResult を実行すると、コードで arrayindexoutofbounds エラーが発生することです。

私の OnActivityResult ケースの 1 つ:

  case INSERT_MOVIE:
            Lab8_082588FetchDetails insertMovie = new Lab8_082588FetchDetails();
            ListView list = getListView();
            list.setChoiceMode(ListView.CHOICE_MODE_SINGLE);
            NumberFormat formatterInsert = new DecimalFormat("###,###,###");

            insertMovie.setTitle(data
                    .getStringExtra(Lab8_082588Insert.TITLE_STRING));
            insertMovie.setGross("$"
                    + formatterInsert.format(Double.parseDouble(data
                            .getStringExtra(Lab8_082588Insert.GROSS_STRING))));
            insertMovie.setDate(data
                    .getStringExtra(Lab8_082588Insert.DATE_STRING));
            results.add(insertMovie);
            adapter.notifyDataSetChanged();

私のOnOptionsItemSelected:

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

private void insert(MenuItem item) {
    // TODO Auto-generated method stub
    AdapterContextMenuInfo info = (AdapterContextMenuInfo) item
            .getMenuInfo();
    Intent insertData = new Intent(Lab8_082588.this,
            Lab8_082588Insert.class);
    insertData.putExtra(Lab8_082588.CURRENT_ROW, info.position); //nullPointerException
    startActivityForResult(insertData, Lab8_082588.INSERT_MOVIE);
}

私の挿入クラス:

    public class Lab8_082588Insert extends Activity {

public static final String TITLE_STRING = "TITLE_STRING";
public static final String GROSS_STRING = "GROSS_STRING";
public static final String DATE_STRING = "DATE_STRING";
public static final String PASSED_ROW = "PASSED_ROW";

@Override
protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    setContentView(R.layout.addeditinsert);
    Intent rowNumber = getIntent();
    results.add(data.getIntExtra(Lab8_082588Insert.PASSED_ROW, 0) + 1, insertMovie);
            adapter.notifyDataSetChanged();
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.menu3, menu);
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    // Handle item selection using item.getItemId()
    switch (item.getItemId()) {
    case R.id.insert2:
        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 data = getIntent();
        int rowNumber = getIntent().getIntExtra(Lab8_082588.CURRENT_ROW, 0);
        data.putExtra(Lab8_082588Insert.TITLE_STRING, title);
        data.putExtra(Lab8_082588Insert.GROSS_STRING, gross);
        data.putExtra(Lab8_082588Insert.DATE_STRING, date);
        data.putExtra(Lab8_082588Insert.PASSED_ROW, rowNumber);
        setResult(RESULT_OK, data);
        finish();
    }
}
4

1 に答える 1

0

コードを完全には理解していませんが、getCheckedItemPosition()メソッドの再実行を新しく挿入されたアイテムのインデックスとして使用したのはなぜですか?

ユーザーが選択した行の後にそれらを挿入したいだけの場合は、ユーザーがクリックしたアイテムの位置を単純に渡し(insertData前の質問でこれを行う方法を知っていることを確認しました)、これをに渡します挿入用のデータを収集するアクティビティ。挿入アクティビティでは、ユーザーが挿入したデータに沿って、行の位置を返し (次の位置に挿入できるように 1 ずつインクリメントします)、それをリスト追加のインデックスとして使用しonActivityResultます。

あなたは私の言ったことをよく理解していませんでした。insertメソッドでは:

private void insert(MenuItem item) {
    AdapterContextMenuInfo info = (AdapterContextMenuInfo) item
            .getMenuInfo();
    Intent insertData = new Intent(Lab8_082588.this,
            Lab8_082588Insert.class);
    insertData.put("CURRENT_ROW", info.position);// there is no need for extra data, you're going to insert it anyway
    startActivityForResult(insertData, Lab8_082588.INSERT_MOVIE);
}

次に、挿入アクティビティでその行番号を取得し、結果を返すときにインテントに追加します。

//
super.onCreate(savedInstanceState);
setContentView(R.layout.addeditinsert);
rowNumber = getIntent().getExtra("CURRENT_ROW");

そしてそれを終わりに渡しますIntent

    hobby.putExtra(TITLE_STRING, title);
    hobby.putExtra(GROSS_STRING, gross);
    hobby.putExtra(DATE_STRING, date);
    hobby.putExtra("PASSED_ROW", rowNumber);
    setResult(RESULT_OK, hobby);
    finish();

onActivityResult

results.add(data.getIntExtra("PASSED_ROW") + 1, insertMovie);
于 2012-08-19T09:55:27.040 に答える