2012-03-03 51 views
0

我正尝试使用此代码获取Android.by中的所有电话号码和电子邮件。正在获取大量联系人

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显示所有这些联系人。如果我获取所有联系人在后台用户将看到很长一段时间的空列表。提出了一些解决方案

回答

1

我甚至有显著数量较少接触的前一段时间有非常类似的问题。

我需要填充列表视图中的所有联系人,并允许用户从中选择。最初,我在列表视图中加载了所有联系信息。然而,这需要很多查询,这实际上很慢。

所以我改变了我的设计:我只选择了联系人姓名和联系人ID,并将其记录在一个对象中。之后当我的应用程序的用户选择了任何联系人时,我只加载了他的数据。这转变得非常快(如预期)。在我的情况下,它工作得很好,因为我查询了很多我从来没有需要的信息(即所有未选定联系人的电话号码和电子邮件)。

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

+0

是的,我想在列表view.Could请您解释一下懒加载列表视图与适配器或者你可以转发给我一些例子或tutorials.And感谢您的快速与联系人姓名一起显示所有数据回答 – Khushwant 2012-03-03 12:58:58

+0

以下是关于该主题的一个快速教程:http://www.softwarepassion.com/android-series-custom-listview-items-and-adapters/。希望它会让你开始。这个想法是,只有当get view被调用时才会加载项目,并且这大概只在显示项目时才会发生。 – 2012-03-03 13:08:38

+0

感谢您的教程。但在本教程中UI被阻止,我不想要这个。 – Khushwant 2012-03-05 12:55:47