获取所有联系人并在列表视图中显示它们

Posted

技术标签:

【中文标题】获取所有联系人并在列表视图中显示它们【英文标题】:Fetching all Contacts and showing them in listview 【发布时间】:2013-06-28 06:42:46 【问题描述】:

我正在列表视图中显示所有联系人,并且效果很好。但我也想将图像添加到列表视图。搜索了很多,但没有找到任何好的教程。请建议一些在列表视图上显示联系人图像的教程。以下是我的代码。

Cursor cur = getContacts();

    ListView lv = getListView();

    String[] fields = new String[] ContactsContract.Data.DISPLAY_NAME ;


    adapter = new SimpleCursorAdapter(this,
            R.layout.contacts_list_row, cur, fields,
            new int[]  R.id.title, 0);
    lv.setAdapter(adapter);

getContacts()

private Cursor getContacts() 
    // Run query
    Uri uri = ContactsContract.Contacts.CONTENT_URI;

    String[] projection = new String[]  ContactsContract.Contacts._ID,
            ContactsContract.Contacts.DISPLAY_NAME ;
    String selection = null;
    String[] selectionArgs = null;
    String sortOrder = ContactsContract.Contacts.DISPLAY_NAME
            + " COLLATE LOCALIZED ASC";
    return managedQuery(uri, projection, selection, selectionArgs,
            sortOrder);

提前致谢:)

【问题讨论】:

***.com/questions/17267859/…。尝试链接中的示例 @Raghunandan 首先阅读问题。 【参考方案1】:

使用 ImageView 和 TextView 编写自定义列表视图,并使用以下代码从 Content Provider 获取联系人图标图像

   /**
     * @return the photo URI
     */
    public Uri getPhotoUri() 
        try 
            Cursor cur = this.ctx.getContentResolver().query(
                    ContactsContract.Data.CONTENT_URI,
                    null,
                    ContactsContract.Data.CONTACT_ID + "=" + this.getId() + " AND "
                            + ContactsContract.Data.MIMETYPE + "='"
                            + ContactsContract.CommonDataKinds.Photo.CONTENT_ITEM_TYPE + "'", null,
                    null);
            if (cur != null) 
                if (!cur.moveToFirst()) 
                    return null; // no photo
                
             else 
                return null; // error in cursor process
            
         catch (Exception e) 
            e.printStackTrace();
            return null;
        
        Uri person = ContentUris.withAppendedId(ContactsContract.Contacts.CONTENT_URI, Long
                .parseLong(getId()));
        return Uri.withAppendedPath(person, ContactsContract.Contacts.Photo.CONTENT_DIRECTORY);
    

然后检查条件图像是否可用然后设置为imageview

 Uri u = objItem.getPhotoUri();
 if (u != null) 
    mPhotoView.setImageURI(u);
  else 
    mPhotoView.setImageResource(R.drawable.defaultimage);
 

【讨论】:

您应该编写自定义适配器而不是使用“SimpleCursorAdapter”。在谷歌中找到编写自定义适配器。这可能有助于androidhive.info/2012/02/… 我相信getId()只是存储当前人的id,可能在自定义适配器中找到。【参考方案2】:

我不知道您是否会找到有关如何使用简单适配器添加图像的教程...您可能需要创建一个自定义列表适配器。

这真的很简单,并为您提供了极大的灵活性。 try this 这应该是一个不错的起点。

您需要创建一个具有 ImageView 和名称的布局,然后在适配器中您可以设置图像和名称等。

【讨论】:

是的,你是对的,我知道如何编写适配器,但主要问题是找到联系人图像的获取和设置方式。 哦,我明白了。我假设您可以将图像列的名称添加到投影字符串数组中,它会返回带有光标的 URI?否则,您将不得不重新查询联系人以获取您从 getContacts()返回的游标中获取的 ID 的 URI

以上是关于获取所有联系人并在列表视图中显示它们的主要内容,如果未能解决你的问题,请参考以下文章

使用 android 2.1 在我自己的列表视图中显示姓名和联系电话

在列表视图中获取所有联系人(来自 Phone 和 sim )

使用 ContentProvider 从联系人获取电话号码 - Android

根据联系人姓名获取 sectionIndex 标题

在 Android 中高效处理动态列表视图项

安卓。将联系人显示为列表视图