多个联系人选取器列表
Posted
技术标签:
【中文标题】多个联系人选取器列表【英文标题】:Multiple Contact Picker List 【发布时间】:2012-07-02 06:52:26 【问题描述】:我有一个联系人选择器列表,其中包含具有电话号码的联系人的复选框。 现在,我的问题是似乎无法获取选中的联系人的姓名和电话号码。
这是我的代码:
import android.app.ListActivity;
import android.content.ContentResolver;
import android.content.Intent;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.provider.ContactsContract;
import android.provider.ContactsContract.CommonDataKinds.Phone;
import android.util.Log;
import android.util.SparseBooleanArray;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListAdapter;
import android.widget.ListView;
import android.widget.SimpleCursorAdapter;
public class Create_Group extends ListActivity implements OnClickListener
// List variables
public String[] Contacts = ;
public int[] to = ;
public ListView myListView;
Button save_button;
@Override
public void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(R.layout.create_group);
// Initializing the buttons according to their ID
save_button = (Button)findViewById(R.id.save_group_button);
// Defines listeners for the buttons
save_button.setOnClickListener(this);
Cursor mCursor = getContacts();
startManagingCursor(mCursor);
ListAdapter adapter = new SimpleCursorAdapter(this, android.R.layout.simple_list_item_multiple_choice, mCursor,
Contacts = new String[] ContactsContract.Contacts.DISPLAY_NAME ,
to = new int[] android.R.id.text1 );
setListAdapter(adapter);
myListView = getListView();
myListView.setItemsCanFocus(false);
myListView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
private Cursor getContacts()
// Run query
Uri uri = ContactsContract.Contacts.CONTENT_URI;
String[] projection = new String[] ContactsContract.Contacts._ID,
ContactsContract.Contacts.DISPLAY_NAME;
String selection = ContactsContract.Contacts.HAS_PHONE_NUMBER + " = '"
+ ("1") + "'";
String[] selectionArgs = null;
String sortOrder = ContactsContract.Contacts.DISPLAY_NAME
+ " COLLATE LOCALIZED ASC";
return managedQuery(uri, projection, selection, selectionArgs,
sortOrder);
public void onClick(View src)
Intent i;
switch (src.getId())
case R.id.save_group_button:
int checked_Names_Counter = 0;
// Goes over the list of contacts and checks which were checked
for (int j = 0; j < myListView.getCount(); j++)
if (myListView.isItemChecked(j) == true)
Cursor cur = getContacts();
ContentResolver contect_resolver = getContentResolver();
cur.moveToFirst();
/**
* Here I tried to compare the IDs but each list has different IDs so it didn't really help me...
// Converts the current checked name ID into a String
String Checked_ID = String.valueOf(myListView.getCheckedItemIds()[checked_Names_Counter]);
// Checks if the current checked ID matches the cursors ID, if not move the cursor to the next name
while (Checked_ID != cur.getString(cur.getColumnIndexOrThrow(ContactsContract.Contacts._ID)))
cur.moveToNext();
*/
/**
* Here I tried to compare the names, even though it's not a good pratice, and it didn't work either...
String Checked_Name = myListView.getAdapter().getItem(checked_Names_Counter).toString();
// Checks if the current checked ID matches the cursors ID, if not move the cursor to the next name
while (Checked_Name != cur.getString(cur.getColumnIndexOrThrow(ContactsContract.Contacts.DISPLAY_NAME)))
cur.moveToNext();
*/
String id = cur.getString(cur.getColumnIndexOrThrow(ContactsContract.Contacts._ID));
String name = "";
String no = "";
Cursor phoneCur = contect_resolver.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null,
ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = ?", new String[] id , null);
name = phoneCur.getString(phoneCur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
no = phoneCur.getString(phoneCur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
id = null;
name = null;
no = null;
phoneCur = null;
checked_Names_Counter++;
// Goes back to the Manage Groups screen
i = new Intent(this, Manage_Groups.class);
startActivity(i);
break;
有什么想法吗?
谢谢!!
【问题讨论】:
【参考方案1】:看起来你很亲密,我使用 ListView.getCheckedItemIds() 来返回所选联系人的唯一 ID:
public void onClick(View view)
long[] ids = myListView.getCheckedItemIds();
for(long id : ids)
Cursor contact = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null,
ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = ?", new String[] id + "" , null);
// Do whatever you want with the data
加法
我有一个关于这段代码的小问题:
// Goes back to the Manage Groups screen
i = new Intent(this, Manage_Groups.class);
startActivity(i);
这是否会让用户回到上一个 Activity?如果是这样,您应该改用finish();
。 finish() 结束当前 Activity,将其从堆栈中取出并释放所有内存(浪费的内存更少意味着应用程序更快。)它还允许之前的 Activity 在离开时恢复保存的状态(填充 EditTexts,之前的 Spinner 选择、切换按钮和复选标记等)Activity 从用户离开的地方继续。
【讨论】:
是的,它确实回到了以前的活动,我会添加你所说的。另外,我只是简单地检查了您发布的内容,但我认为它很好用,我稍后会完成检查。谢谢!!! @user1476876 如果此答案对您有帮助,请单击左上角的复选标记。 作为对看到此答案的其他人的警告。您不应该在主线程上调用 ContentResolver.query。由于调用将执行文件 IO,因此您可能会遇到 ANR。在 Loader 或 AsyncTask 或类似中加载联系人。您还可以编辑查询以在一个查询中加载所有相关联系人,而不是每个联系人一个查询。以上是关于多个联系人选取器列表的主要内容,如果未能解决你的问题,请参考以下文章
Windows phone 8.1 使用联系人选取器检索电子邮件和电话号码