创建自动完成文本视图以显示联系人
Posted
技术标签:
【中文标题】创建自动完成文本视图以显示联系人【英文标题】:Create autocompletetextview to display contacts 【发布时间】:2013-09-23 16:36:38 【问题描述】:我想在应用程序中创建一个自动完成的文本视图,它将读取并显示用户的电话联系人。首先我尝试了here 给出的链接,但问题是 UI 线程中发生的一切,因此我的 UI 线程会冻结 10 秒。
我看到了很多例子,但都发生在 UI 线程中。
然后在谷歌上搜索了很多之后,我来到了 cursoradapter 的概念,并找到了一个非常好的项目,给出了here,但问题是这个例子使用了Contacts.CONTENT_URI
,我无法获得与每个联系人关联的电话号码。
我尝试将 uri 更改为 ContactsContract.CommonDataKinds.Phone
,但没有成功。
然后我修改getitem方法如下:
@Override
public Object getItem(int position)
Cursor cursor = (Cursor) super.getItem(position);
Contact contact = new Contact();
String imageUri = cursor
.getString(ContactsQuery.PHOTO_THUMBNAIL_DATA_COLUMN);
Bitmap bitmap = loadContactPhotoThumbnail(imageUri,
mDropdownItemHeight);
if (bitmap == null)
bitmap = mLoadingImage;
contact.id = cursor.getLong(ContactsQuery.ID_COLUMN);
Cursor phones = mContext.getContentResolver().query(
ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
null,
ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = "
+ contact.id, null, null);
while (phones.moveToNext())
String phoneNumber = phones
.getString(phones
.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
Log.d(TAG, "Number: " + phoneNumber);
contact.lookupKey = cursor
.getString(ContactsQuery.LOOKUP_KEY_COLUMN);
contact.displayName = cursor
.getString(ContactsQuery.DISPLAY_NAME_COLUMN);
contact.image = bitmap;
return contact;
这给了我联系电话,但我猜查询仍然发生在 UI 线程中。 我希望它发生在后台线程中。我如何做到这一点。
还请告知是否有替代方法。
【问题讨论】:
安卓默认消息应用是怎么做到的??? :// 【参考方案1】:您可以编写AsyncTask
并检索doInBackgroud
中的记录,然后在onPostExecute
方法中将适配器设置为自动完成文本视图。可以做这样的事情:
private void loadContacts()
AsyncTask<Void, Void, Void> contactsTask = new AsyncTask<Void, Void, Void>()
ProgressDialog progressDialog = null;
@Override
protected void onPreExecute()
final String msg = "Loading Contacts...";
progressDialog = ProgressDialog.show(mContext, "Contacts", msg);
@Override
protected Void doInBackground(Void... params)
final String projection[] = Contacts.DISPLAY_NAME, Phone.NUMBER, "_id" ;
final String selection = null;
final String[] selectionArgs = null;
Cursor contactsCursor = mContext.getContentResolver().query(Phone.CONTENT_URI,
projection, selection, selectionArgs, null);
final int[] toResources = R.id.textView1, R.id.textView2;
mContactsAdapter = new SimpleCursorAdapter(mContext,
R.layout.contacts_row, contactsCursor,
projection, toResources,0);
return null;
@Override
protected void onPostExecute(Void result)
progressDialog.dismiss();
autoCompleteTextView.setAdapter(mContactsAdapter);
;
contactsTask.execute(null,null);
【讨论】:
是的,我知道.. 但我仍然不想显示加载联系人对话框。我的意思是,当您使用 android 默认消息应用程序时,您不会看到加载对话框。 所以不要显示对话框。只需将代码保留在 doInBackground 方法中即可。但加载联系人肯定需要时间。以上是关于创建自动完成文本视图以显示联系人的主要内容,如果未能解决你的问题,请参考以下文章
从对象的 ArrayList 中获取字符串以用于自动完成文本视图