如何在单击android中的listview项目时从数据库中获取id

Posted

技术标签:

【中文标题】如何在单击android中的listview项目时从数据库中获取id【英文标题】:How to get id from database on click of listview item in android 【发布时间】:2012-09-22 04:11:55 【问题描述】:

我在本网站上搜索了与此相关的各种问题,但我无法解决我遇到的问题。

我想在点击列表视图项时从数据库中获取 id

这是我的分类课程:

package com.example.reminders;

import java.util.List;

import android.app.ListActivity;
import android.content.Intent;
import android.database.Cursor;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.Toast;

public class Categories extends ListActivity 

    @Override
    public void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        DBAdapter db = new DBAdapter(Categories.this);
        db.open();
        List<String> cs = db.getAllCategoriesList();
        setListAdapter(new ArrayAdapter<String>(this, R.layout.activity_categories,cs));
        ListView listView = getListView();
        listView.setTextFilterEnabled(true);
        listView.setOnItemClickListener(new OnItemClickListener() 
            public void onItemClick(AdapterView<?> parent, View view,
                    int position, long id) 
                // When clicked, show a toast with the TextView text

                 Cursor cur = (Cursor) parent.getItemAtPosition(position);
                Toast.makeText(getApplicationContext(),
                "id:"+id+"position:"+position+"rowid:"+cur.getInt(cur.getColumnIndex("_id")), Toast.LENGTH_LONG).show();
            
        ); 
        db.close();


    



DBAdapter 类中定义的getAllCategoriesList 函数是:

//---retrieves all the category data---
    public List<String> getAllCategoriesList() 
    
        String[] columns = new String[] KEY_NAME2;
        Cursor c = db.query(DATABASE_TABLE2, columns, null, null, null, null,
            KEY_NAME2);     
       // String results = "";
        List<String> results = new ArrayList<String>();
        int iCM = c.getColumnIndex(KEY_NAME2);

        for (c.moveToFirst(); !c.isAfterLast(); c.moveToNext()) 
            results.add(c.getString(iCM));
        
        return results;

    

当我运行示例代码时,出现以下错误:

10-01 15:05:22.507: E/AndroidRuntime(20846): java.lang.ClassCastException: java.lang.String cannot be cast to android.database.Cursor

【问题讨论】:

【参考方案1】:

您没有从数据库中查询 _id(仅 KEY_NAME2 列),因此您无法从适配器中获取它。

这一行:

Cursor cur = (Cursor) parent.getItemAtPosition(position);

完全错误。您正在尝试将字符串(由 ArrayAdapter&lt;String&gt; 返回到游标,这永远无法工作。

您需要做的是为您的 ListView 使用CursorAdapter(或SimpleCursorAdapter)。游标应至少查询 _id 和 KEY_NAME2。

使用此适配器,getItem(int position) 将返回一个设置为请求位置的光标。那么你需要做的就是cursor.getInt(cursor.getColumnIndex("_id")),你就在那里。

【讨论】:

感谢 bartosz 的回复。我之前尝试过 SimpleCursorAdapter 方法,但它显示不推荐使用的警告。我还没有深入研究 CursorAdapter 方法。所以必须调查一下。 CursorAdapter 和 SimpleCursorAdapter 现已弃用 @numediaweb 请解释一下。它们每个都有一个已弃用的构造函数,但其​​他构造函数是有效的。也许我错过了什么。有哪些替代品? @BartoszFilipowicz 仅弃用构造函数,而不是整个类:***.com/questions/8790659/…

以上是关于如何在单击android中的listview项目时从数据库中获取id的主要内容,如果未能解决你的问题,请参考以下文章

如何禁用在android中单击ListView?

使用警报对话框android的颜色ListView项目

单击 Listview 中的项目时,如何在新活动中从 Firebase 检索数据?

单击图像时如何更改ListView中的图像?

在 android 中单击按钮时将列表视图中的选中项目转移到另一个列表视图

在android的listview中突出显示所选项目