创建自动完成文本视图以显示联系人

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 中获取字符串以用于自动完成文本视图

如何创建具有自动完成功能的文本输入,然后以 express 方式显示 mysql 数据库中的数据?

IOS中带有静态数组数据的自动完成文本字段

自动完成文本视图的选定项目显示为简单的Textview?

带有联系人的自动完成 TextView

高级自动完成 Swift