创建autocompletetextview以显示联系人

时间:2013-09-18 19:07:52

标签: android cursor android-contacts android-cursoradapter

我想在应用程序中创建一个自动完整的textview,它将读取并显示用户的手机联系人。首先我尝试了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 个答案:

答案 0 :(得分:0)

您可以编写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);
}