如何获取数据库来源的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
相关产品推荐
相关产品推荐

