【问题标题】:Fetching a large number of contacts获取大量联系人
【发布时间】:2012-03-21 17:00:48
【问题描述】:

我正在尝试使用此代码获取 Android 中的所有电话号码和电子邮件。

enter code here 

            String KEY_NAME = "Name";
            String KEY_NO   = "No";

    String selection = ContactsContract.CommonDataKinds.Phone.IN_VISIBLE_GROUP + " = 1";
    String sortOrder = ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME + " COLLATE LOCALIZED ASC";


    String data="";
    String name="";
    ContactEntry contactObj;
    String id;

    List<String> temp = new ArrayList<String>();

    final String[] projection = new String[]{ContactsContract.Contacts._ID , ContactsContract.Contacts.DISPLAY_NAME , ContactsContract.Contacts.HAS_PHONE_NUMBER};

    final String[] email_projection = new String[] {ContactsContract.CommonDataKinds.Email.DATA , ContactsContract.CommonDataKinds.Email.TYPE};

    final String[] phone_projection = new String[] {ContactsContract.CommonDataKinds.Phone.NUMBER, ContactsContract.CommonDataKinds.Phone.TYPE};

    ContentResolver cr = context.getContentResolver();
    Cursor cur = cr.query(ContactsContract.Contacts.CONTENT_URI , projection , selection , null , sortOrder);

    if(cur.getCount()>0){

        while(cur.moveToNext()){

             id = cur.getString(cur.getColumnIndex(ContactsContract.Contacts._ID));
             name = cur.getString(cur.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));

            if (Integer.parseInt(cur.getString(cur.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER))) > 0) {

                // get the phone number
                Cursor pCur = cr.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI , phone_projection , 
                                        ContactsContract.CommonDataKinds.Phone.CONTACT_ID +" = ?",new String[]{id}, null);

                while (pCur.moveToNext()){

                         data =  pCur.getString(pCur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));

                        if(!temp.contains(data) && !data.equals(null)){

                        }
                } 
                    pCur.close();
            }

           Cursor emailCur = cr.query(ContactsContract.CommonDataKinds.Email.CONTENT_URI, email_projection,
                                        ContactsContract.CommonDataKinds.Email.CONTACT_ID + " = ?",  new String[]{id}, null); 

           while (emailCur.moveToNext()){ 


                data = emailCur.getString(emailCur.getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA));

                if(!temp.contains(data) && !data.equals(null)){             

                }
            } 
            emailCur.close();

        }

    }

此代码运行良好。但是对于大量的联系人,比如说 5000 个联系人,它会阻塞 UI 线程。如何创建一个 ListAdapter 来显示所有这些联系人。如果我在后台获取所有联系人,用户将长时间看到空列表。请提出一些解决方案

【问题讨论】:

    标签: android listview contacts android-contacts android-cursor


    【解决方案1】:

    前段时间我遇到了非常相似的问题,即使联系人数量明显减少。

    我需要在列表视图中填充所有联系人并允许用户从中进行选择。最初,我在列表视图中加载所有联系信息。但是,这确实需要大量查询,这实际上很慢。

    所以我改变了我的设计:我只选择了联系人姓名和联系人 ID,并将其记录在一个对象中。之后,当我的应用程序的用户选择任何联系人时,我只加载了他的数据。这变得更快(如预期的那样)。就我而言,它运行良好,因为我查询了很多我实际上从未需要的信息(即所有未选择联系人的电话号码和电子邮件)。

    希望您能够以类似的方式重新设计您的应用。但是,如果您需要立即在列表视图中显示 data 变量的内容,您真的可能需要使用适配器进行延迟加载列表视图(希望它即使在快速滚动时也能顺利执行)。

    【讨论】:

    • 是的,我想在列表视图中显示所有数据以及联系人姓名。您能否详细解释一下带有适配器的延迟加载列表视图,或者您能否将我转发给一些示例或教程。并感谢您的快速回答
    • 这是一个关于该主题的快速教程:softwarepassion.com/…。希望它能让你开始。这个想法是项目将在调用 get view 时被加载,并且这大概只会在项目显示时发生。
    • 感谢教程。但是在本教程中,用户界面被阻止了,我不想要这个。
    • 看看这里stackoverflow.com/questions/10844672/…它可能会解决你的问题
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-16
    • 2013-12-27
    • 1970-01-01
    • 2017-06-22
    • 2016-10-22
    相关资源
    最近更新 更多