如何修改cr.delete()方法删除选中单个联系人而非全部联系人
问题
当前代码会删除全部联系人,请问能否编辑cr.delete()方法来删除当前选中的联系人?我尝试过使用getPosition等多种方法来选中当前联系人,但不清楚具体操作方式。
原代码:
btnContactDelete.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { AlertDialog.Builder builder = new AlertDialog.Builder(ContactDetailActivity.this); builder.setTitle("Confirm"); builder.setMessage("Are you sure you want to delete this contact?"); builder.setPositiveButton("YES", new DialogInterface.OnClickListener() { @SuppressLint("Range") @Override public void onClick(DialogInterface dialog, int which) { ContentResolver cr = getContentResolver(); Cursor cur = cr.query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null); while (cur.moveToNext()) { try { String lookupKey = cur.getString(cur.getColumnIndex(ContactsContract.Contacts.LOOKUP_KEY)); Uri uri = Uri.withAppendedPath(ContactsContract.Contacts.CONTENT_LOOKUP_URI, lookupKey); System.out.println("The uri is " + uri.toString()); cr.delete(uri, null, null); Intent backToHomeScreen = new Intent(ContactDetailActivity.this, HomePage.class); startActivity(backToHomeScreen); } } } }); builder.setNegativeButton("NO", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { // Do nothing dialog.dismiss(); } }); AlertDialog alert = builder.create(); alert.show(); } }); }
解决方案
你的代码会删除全部联系人,原因是查询了所有联系人列表,然后通过while循环逐个删除,自然会把所有联系人都删掉。要实现删除当前选中的联系人,核心是获取当前联系人的唯一标识(比如CONTACT_ID或LOOKUP_KEY),直接定位到该联系人进行删除,不需要遍历全量数据。
步骤1:跳转至详情页时传递当前联系人标识
从联系人列表页跳转到ContactDetailActivity时,把选中联系人的CONTACT_ID通过Intent传过来:
// 假设这是列表页的跳转逻辑,contactId是当前选中项的联系人ID Intent intent = new Intent(ContactListActivity.this, ContactDetailActivity.class); intent.putExtra("SELECTED_CONTACT_ID", contactId); startActivity(intent);
步骤2:在详情页接收联系人标识
在ContactDetailActivity的onCreate方法中,获取传入的联系人ID(可定义为Activity成员变量,方便后续使用):
long selectedContactId = getIntent().getLongExtra("SELECTED_CONTACT_ID", -1);
步骤3:修改删除逻辑,只删除选中的联系人
把原来点击事件中遍历Cursor的代码替换成以下逻辑,直接通过ID定位并删除:
builder.setPositiveButton("YES", new DialogInterface.OnClickListener() { @SuppressLint("Range") @Override public void onClick(DialogInterface dialog, int which) { if (selectedContactId == -1) { dialog.dismiss(); return; } ContentResolver cr = getContentResolver(); // 根据联系人ID构建唯一的删除Uri Uri targetContactUri = ContentUris.withAppendedId(ContactsContract.Contacts.CONTENT_URI, selectedContactId); try { cr.delete(targetContactUri, null, null); Intent backToHomeScreen = new Intent(ContactDetailActivity.this, HomePage.class); startActivity(backToHomeScreen); } catch (Exception e) { e.printStackTrace(); // 可添加删除失败的提示逻辑 } } });
补充:用LOOKUP_KEY的方式(可选)
如果你更倾向于用LOOKUP_KEY(相比ID更稳定,不会因联系人更新而变化),可以在跳转时传递LOOKUP_KEY:
// 列表页跳转时 intent.putExtra("SELECTED_LOOKUP_KEY", lookupKey);
然后在详情页获取并构建Uri:
String lookupKey = getIntent().getStringExtra("SELECTED_LOOKUP_KEY"); Uri targetContactUri = Uri.withAppendedPath(ContactsContract.Contacts.CONTENT_LOOKUP_URI, lookupKey);
内容的提问来源于stack exchange,提问作者user20791491
相关产品推荐
相关产品推荐

