You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何获取数据库来源的ListView中每个项的ID

如何获取ListView列表项对应的数据库ID?

看起来你已经在从数据库加载ListView的路上了,要获取每个列表项对应的数据库ID,核心是把ID和列表项绑定在一起,然后在点击时取出。我结合你的代码给你一步步拆解解决方案:

1. 确保查询数据库时包含ID字段

首先,你需要在数据库查询中把患者ID(假设你的字段名是pat_id)包含进来,这样才能拿到每个项对应的ID。补全你的查询代码:

@Override 
protected void onCreate( Bundle savedInstanceState ) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.patient_list); 
    try{ 
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); 
        displaypatientinfo = (ListView)findViewById(R.id.lv_patientlist); 
        mydb = new DatabaseHelper(getApplicationContext()); 
        sqLiteDatabase = mydb.getReadableDatabase(); 

        // 1. 定义要查询的字段,必须包含ID(这里假设是pat_id)
        String[] projection = {"pat_id", "pat_name", "pat_type", "is_active"}; // 按需添加其他字段
        String selection = "pat_type=? OR pat_type=? AND is_active=?"; 
        String[] selectionArgs = {"Inpatient", "Outpatient", "1"}; // 补全你的参数

        // 2. 执行查询获取Cursor
        Cursor cursor = sqLiteDatabase.query(
            "patient_table", // 你的表名
            projection, 
            selection, 
            selectionArgs, 
            null, 
            null, 
            null
        );

        // 后续绑定Adapter的代码放在这里...
    } catch (Exception e) {
        e.printStackTrace();
    }
}

2. 用Adapter绑定数据并关联ID

这里分两种常用的Adapter方案:

方案一:使用SimpleCursorAdapter(快速实现)

SimpleCursorAdapter可以直接绑定Cursor数据,但有个要求:Cursor必须包含名为_id的列。如果你的ID字段不是_id,可以在查询时用别名:

// 修改projection,把pat_id别名设为_id
String[] projection = {"pat_id AS _id", "pat_name", "pat_type", "is_active"};

然后创建Adapter并绑定到ListView:

// 假设你的列表项布局里有显示患者名称的TextView(id为tv_patient_name)
String[] fromColumns = {"pat_name"};
int[] toViews = {R.id.tv_patient_name};

SimpleCursorAdapter adapter = new SimpleCursorAdapter(
    this, 
    R.layout.list_item_patient, // 你的列表项布局
    cursor, 
    fromColumns, 
    toViews, 
    0
);
displaypatientinfo.setAdapter(adapter);

方案二:自定义BaseAdapter(更灵活)

如果需要自定义列表项布局或逻辑,可以继承BaseAdapter,在Adapter中保存每个项的ID:

public class PatientAdapter extends BaseAdapter {
    private Context mContext;
    private Cursor mCursor;

    public PatientAdapter(Context context, Cursor cursor) {
        mContext = context;
        mCursor = cursor;
    }

    @Override
    public int getCount() {
        return mCursor.getCount();
    }

    @Override
    public Object getItem(int position) {
        mCursor.moveToPosition(position);
        return mCursor;
    }

    // 关键:返回当前项对应的数据库ID
    @Override
    public long getItemId(int position) {
        mCursor.moveToPosition(position);
        return mCursor.getLong(mCursor.getColumnIndex("pat_id"));
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder holder;
        if (convertView == null) {
            convertView = LayoutInflater.from(mContext).inflate(R.layout.list_item_patient, parent, false);
            holder = new ViewHolder();
            holder.patientNameTv = convertView.findViewById(R.id.tv_patient_name);
            convertView.setTag(holder);
        } else {
            holder = (ViewHolder) convertView.getTag();
        }

        mCursor.moveToPosition(position);
        String patientName = mCursor.getString(mCursor.getColumnIndex("pat_name"));
        // 也可以把ID存在ViewHolder里,方便后续获取
        holder.patientId = mCursor.getLong(mCursor.getColumnIndex("pat_id"));
        
        holder.patientNameTv.setText(patientName);
        return convertView;
    }

    static class ViewHolder {
        TextView patientNameTv;
        long patientId;
    }
}

然后绑定Adapter:

PatientAdapter adapter = new PatientAdapter(this, cursor);
displaypatientinfo.setAdapter(adapter);

3. 设置点击监听器获取ID

不管用哪种Adapter,都可以通过ListView的点击监听器拿到ID:

displaypatientinfo.setOnItemClickListener(new AdapterView.OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
        // 方案一:用SimpleCursorAdapter时,这里的id就是Cursor中_id字段的值(即数据库ID)
        // 方案二:用自定义Adapter时,id就是getItemId返回的数据库ID
        long selectedPatientId = id;

        // 如果你用自定义Adapter的ViewHolder,也可以这样拿:
        // PatientAdapter.ViewHolder holder = (PatientAdapter.ViewHolder) view.getTag();
        // long selectedPatientId = holder.patientId;

        // 现在就可以用这个ID做你需要的操作了,比如查询患者详情
        Toast.makeText(getApplicationContext(), "选中的患者ID:" + selectedPatientId, Toast.LENGTH_SHORT).show();
    }
});

注意事项

  • 记得在Activity销毁时关闭Cursor,避免内存泄漏:
    @Override
    protected void onDestroy() {
        super.onDestroy();
        if (cursor != null && !cursor.isClosed()) {
            cursor.close();
        }
        if (sqLiteDatabase != null && sqLiteDatabase.isOpen()) {
            sqLiteDatabase.close();
        }
    }
    
  • 如果你的数据库表没有_id字段,一定要用别名AS _id,否则SimpleCursorAdapter会报错。

内容的提问来源于stack exchange,提问作者Niño Cuenco

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 06:25:16