【问题标题】:Adding Entry in ListView via Selection Mode通过选择模式在 ListView 中添加条目
【发布时间】:2012-08-19 07:41:43
【问题描述】:

我有一个包含电影的列表视图。该列表在 strings.xml 中声明。用户可以将电影添加到此列表视图,可以编辑条目并可以删除条目。

我正在实现一个新的“插入”方法,该方法允许用户突出显示(即,使用发射箭头,使用鼠标的轨迹球)每个条目,并在所选条目的正下方插入一个新电影。我的问题是,当我从插入活动中设置结果时,我的代码中出现了 arrayindexoutofbounds 错误:

我的一个 OnActivityResult 案例:

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

【问题讨论】:

  • 知道您究竟在哪一行得到异常会很有帮助。
  • 这个results.add(list.getCheckedItemPosition(), insertMovie);
  • 您是否尝试查看list.getCheckedItemPosition() 的值是什么,如果没有返回-1 意味着没有选择?
  • 我尝试过 Toast.makeText(getApplicationContext(),list.getCheckedItemPosition(), Toast.LENGTH_SHORT).show();但该行会导致资源未找到错误:原因:android.content.res.Resources$NotFoundException: String resource ID #0xffffffff
  • 使用Log.e("FIND ME", String.valueOf(list.getCheckedItemPosition()));,然后搜索Logcat,看看你会得到什么。或者像您一样使用Toast,但在list.getCheckedItemPosition 之前添加"" + 。

标签: java android arraylist android-listview selection


【解决方案1】:

我不完全理解你的代码,但是你为什么使用getCheckedItemPosition()方法的返回作为新插入项的索引?

如果您只想在用户选择的行之后插入它们然后简单地传递用户点击的项目的位置(到insertData,我在你以前看到问题您知道如何执行此操作)并将其传递给将为插入收集数据的活动。在插入活动中,然后沿着用户插入的数据,返回行的位置(将其增加一,以便您可以在下一个位置插入)并将其用作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);

【讨论】:

  • 哦,我明白了,你在哪里。我稍微改变了我的代码。但是,我不知道如何访问 Insert 活动类中的索引 *Code:Updated
  • rowNumber = getIntent().getExtra("CURRENT_ROW");似乎不起作用。我将其更改为 rowNumber = getIntent().getIntExtra("CURRENT_ROW",0);因为传递的是一个整数。另外, hobby.putExtra("PASSED_ROW", rowNumber);也给出了错误。我会更新我的代码
  • @Erasmus 我是凭记忆写的,我不记得具体的方法了。 hobby 行的错误是什么?您应该在插入活动 rowNumber 中有一个 int 字段,您将从意图中初始化它,然后在最后将它噘嘴放在最终发送回的意图中。
  • rowNumber 无法解析为它所说的变量。同样如您所见,我对您的 rowNumber = getIntent().getExtra("CURRENT_ROW"); 进行了一些更改。它说 Intent 类型的方法 getExtra(String) 未定义。我将其更改为 rowNumber.getIntExtra(Lab8_082588.CURRENT_ROW, 0);它没有错误
  • @Erasmus 我希望你不要在onCreate 方法中声明int rowNumber = getIntent().getIntExtra... 并期望在next() 方法中使用rowNumber。使其成为插入类中的一个字段。
猜你喜欢
  • 2016-10-06
  • 1970-01-01
  • 2017-12-24
  • 1970-01-01
  • 2020-10-16
  • 1970-01-01
  • 1970-01-01
  • 2020-08-25
  • 1970-01-01
相关资源
最近更新 更多