【问题标题】:Android SimpleCursorAdapter ID from Database来自数据库的 Android SimpleCursorAdapter ID
【发布时间】:2012-05-30 11:13:37
【问题描述】:

我在开发的应用程序中遇到了一些问题。 所以,我所有的表都有 _id 字段作为主键,我使用 SimpleCursorAdapter 将它们绑定到 ListViews 和 Spinners。 我想知道的是如何使 ListView 或 Spinner 选定项与相应行具有相同的 ID?

奇怪的是,这适用于 ContextMenu,我直接使用 NotePad 示例:

AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo();
info.id

这个 ID 字段 IS 与表格上的 RowID 相同,我可以很好地删除项目,但是当我尝试这样的事情时:

getListView().setOnItemClickListener(new OnItemClickListener() {

        public void onItemClick(AdapterView<?> adapter, View view,
                int position, long arg) {
            Intent i = new Intent(getApplicationContext(),
                    FuelingList.class);
            long id = view.getId();

ID 字段是一些随机的橡胶状。 所以我的问题是,在第一个代码位中,AdapterContextMenuInfo 获取的 Id 是什么,如何在我的代码的其他部分检索它?

【问题讨论】:

  • 对不起,我不知道。会的,谢谢!
  • 另外一件事,如果我需要访问所选项目的 ID,在代码的任何其他位置(不在侦听器上),有没有比 ((SimpleCursorAdapter) item.getAdapter()) .getCursor().getLong( ((SimpleCursorAdapter) fuelType .getAdapter()).getCursor() .getColumnIndex("_id")) 更简单的方法?

标签: android database sqlite simplecursoradapter


【解决方案1】:

由于您使用的是 SimpleCursorAdapter,因此 onItemClick 会将数据库行 ID 传递给您..

        public void onItemClick(AdapterView<?> adapter, View view, int position, long arg)  

long arg 部分实际上是数据库中的行 ID。

所以你的代码应该是:

getListView().setOnItemClickListener(new OnItemClickListener() { 
     public void onItemClick(AdapterView<?> adapter, View view, 
            int position, long arg) { 
        Intent i = new Intent(getApplicationContext(), 
                FuelingList.class); 
        long id = arg; 

【讨论】:

    【解决方案2】:

    既然你知道你正在使用SimpleCursorAdapter,那么在你的onItemClick方法中,你可以调用

    public void onItemClick(AdapterView<?> adapter, View view, int position, long arg) {
       String value = ((SimpleCursorAdapter) adapter.getAdapter()).getCursor().getString(COLUMN_INDEX);
    }
    

    COLUMN_INDEX 在您要从游标中当前选择的行中获取的列中的位置。

    交替调用

    adapter.getAdapter().getItem(position)
    

    然后将其转换为Cursor,也可以。

    注意 1:AdapterView 实际上是您的ListView

    注意 2:由于您使用 SimpleCursorAdapter,因此适配器上的 getItem(position) 返回位于您指定行的 Cursor

    注意 3:当您有 Cursor 时,您可以通过提供列索引(基于 0)或使用 cursor.getString(cursor.getColumnIndex("COLUMN_NAME")) 来获取数据

    注意 4:根据 Barak 的评论,arg 参数是使用 CursorAdapter 时来自 _ID 字段的值,如果您只需要知道行 _ID,那么只需使用 arg 值.

    【讨论】:

    • 我收到此错误Cannot cast from AdapterView&lt;capture#1-of ?&gt; to SimpleCursorAdapter。此外,我没有在 ListView 的任何字段上保存 ID,但菜单似乎能够访问它...
    • 或许可以试试,((SimpleCursorAdapter)getListView().getAdapter()).getCursor(),而不是。
    • 都不起作用,我收到无效的演员表错误。这里真正的问题是,AdapterContextMenuInfo 如何获得正确的 ID?
    • 无论如何还是非常感谢你,因为我认为这是正确的答案,我只需要找到一种方法让它发挥作用。
    • 我最初将AdapterView 转换为不正确的Adapter :( 我已修复答案以包含正确的代码。顺便说一句,如果您接受了答案,您是否也可以“接受” “它在 StackOverflow 中作为......声誉不会自行建立:)
    【解决方案3】:

    你能否将行的id存储在arraylist中,并从arraylist的相应位置获取行的id。这对我有用..

    protected void onListItemClick(ListView l, View v, int position, long id) {
        // TODO Auto-generated method stub
        super.onListItemClick(l, v, position, id);
    
        Intent intent=new Intent(this , Details.class);
        Bundle extras = new Bundle();
        extras.putLong("ID", IDList.get(position));
        intent.putExtras(extras);
        startActivityForResult(intent, SHOW_DETAILS);
    
    }
    

    您可以使用 listview.setonitenclicklistener... 希望对您有所帮助

    【讨论】:

      猜你喜欢
      • 2013-07-20
      • 1970-01-01
      • 2013-08-30
      • 1970-01-01
      • 2012-04-03
      • 1970-01-01
      • 1970-01-01
      • 2010-12-31
      • 2021-03-24
      相关资源
      最近更新 更多