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 контактов, тогда он блокирует поток пользовательского интерфейса. Как создать ListAdapter для отображения всех этих контактов. Если я соберу все контакты в фоновом режиме, вы увидите пустой список в течение длительного времени. предложить некоторое решение

ответ

1

У меня была очень похожая проблема некоторое время назад даже при значительно меньшем числе контактов.

Мне нужно было заполнить все контакты в виде списка и позволить пользователю выбирать из них. Сначала я загружал всю контактную информацию в виде списка. Однако для этого требовалось действительно много запросов, что на самом деле медленное.

Итак, я изменил свой дизайн: я выбрал только имя контакта и идентификатор контакта и записал его в объекте. Впоследствии, когда пользователь моего приложения выбрал какой-либо контакт, я загрузил только его данные. Это оказалось значительно более быстрым (как и ожидалось). И в моем случае это сработало отлично, потому что я запрашивал много информации, которая мне никогда не нужна (это номера телефонов и электронные письма всех не выбранных контактов).

Надеюсь, вы сможете изменить свое приложение аналогичным образом. Однако, если вам нужно отобразить содержимое переменной data в списке сразу, вам действительно может потребоваться просмотр списка ленивых загрузок с помощью адаптера (давайте просто надеемся, что он будет работать плавно даже при быстрой прокрутке).

+0

Да, я хочу отобразить все данные вместе с именем контакта в списке. Не могли бы вы подробнее рассказать о просмотре списка ленивых загрузок с помощью адаптера или переслать мне некоторые примеры или учебные пособия. И спасибо за ваш быстрый ответ – Khushwant

+0

Вот один быстрый учебник по теме: http://www.softwarepassion.com/android-series-custom-listview-items-and-adapters/. Надеюсь, вам это поможет. Идея состоит в том, что элементы будут загружаться только после вызова вида, и это, вероятно, будет происходить только тогда, когда отображается элемент. –

+0

спасибо за учебник. Но в этом уроке пользовательский интерфейс блокируется, и я не хочу этого. – Khushwant

Смежные вопросы