【问题标题】:dataSource.getItemId(position) returns nulldataSource.getItemId(position) 返回 null
【发布时间】:2012-01-16 02:48:18
【问题描述】:

我正在尝试获取 ListView 成员的数据库 ID,以便将其传递给新活动,但 SimpleCursorAdapter 的 .getItemId(position) 方法返回 null,而不是数据库中的 _id。我的理解是这应该返回光标抓住的 _id 字段,但它对我不起作用。希望有一些建议

DatabaseHelper helper = new DatabaseHelper(this);
    database = helper.getWritableDatabase();
    Cursor data = database.query("myDb", fields, null, null, null, null, null);
    dataSource = new SimpleCursorAdapter(this, R.layout.row, data, fields, new int[] {R.id.idText, R.id.castName, R.id.castDescription});
    data.moveToFirst();

    final ListView view = getListView();

    view.setHeaderDividersEnabled(true);
    view.addHeaderView(getLayoutInflater().inflate(R.layout.row, null));
    setListAdapter(dataSource);


    database.close();

    view.setOnItemClickListener(new AdapterView.OnItemClickListener() {

          @Override
          public void onItemClick(AdapterView<?> arg0, View arg1, int position, long arg3) {


            // Prepare intent
        Intent newActivity = new Intent(getApplicationContext(), ItemIdTester.class);
            newActivity.putExtra("itemId",dataSource.getItemId(position));

            // start activity
            startActivity(newActivity);
          }
        });

【问题讨论】:

  • R.id.idText 是否映射了_id?
  • 是的,据我所知,文本已正确填充
  • 您要查询哪些字段?

标签: android listview cursor android-listview


【解决方案1】:

由于

添加的标头,适配器返回 null
view.setHeaderDividersEnabled(true);
view.addHeaderView(getLayoutInflater().inflate(R.layout.row, null));

我也开始直接从光标中获取数据。这是解决问题的完整 onItemClickListener

view.setOnItemClickListener(new AdapterView.OnItemClickListener() {

          @Override
          public void onItemClick(AdapterView<?> arg0, View arg1, int position, long arg3) {

            Cursor cursor = (Cursor) dataSource.getItem(position-1);

            Long itemId = cursor.getLong(0);  
            // Prepare intent
            Intent newActivity = new Intent(getApplicationContext(), CastrRecorder.class);
            newActivity.putExtra("itemId",itemId.toString());
            // start activity
            startActivity(newActivity);
          }
        });

【讨论】:

  • 为什么addHeaderView让适配器返回null?
  • 标头是列表中的第一个索引。由于该记录不在数据库中,因此 dataSource.getItemId(position) 无法正确执行以从数据库游标中检索 _id。
猜你喜欢
  • 2017-12-24
  • 1970-01-01
  • 1970-01-01
  • 2019-06-18
  • 1970-01-01
  • 1970-01-01
  • 2021-12-20
  • 2020-06-28
  • 1970-01-01
相关资源
最近更新 更多