Получение большого количества контактов

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


person Khushwant    schedule 03.03.2012    source источник


Ответы (1)


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

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

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

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

person Boris Strandjev    schedule 03.03.2012
comment
да, я хочу отобразить все данные вместе с именем контакта в представлении списка. Не могли бы вы объяснить больше о представлении списка с ленивой загрузкой с адаптером, или вы можете направить меня к некоторым примерам или руководствам. И спасибо за ваш быстрый ответ - person Khushwant; 03.03.2012
comment
спасибо за урок. но в этом уроке пользовательский интерфейс блокируется, и я не хочу этого. - person Khushwant; 05.03.2012
comment
Посмотрите здесь stackoverflow.com/questions/10844672/ может решить вашу проблему - person Sagar; 29.09.2017