Android: быстро посмотреть список контактов - PullRequest
2 голосов
/ 05 января 2011

В настоящее время я занимаюсь разработкой приложения, которое должно искать количество контактов (имя и фото) по номеру телефона. Однако это занимает несколько секунд (для каждого контакта: найдите контакт по номеру телефона, получите имя и фотографию контакта).

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

Есть ли лучшее (говорите: проще) решение?

Спасибо.

Ответы [ 3 ]

1 голос
/ 15 августа 2011

вы можете использовать CursorAdapter и переопределить метод bindView (), например:

@Override
public void bindView(final View view, Context context, final Cursor cursor) {
    holder = (ItemHolder) view.getTag();
    ImageView icon = holder.getImageView();
    TextView name = holder.getName();
    final TextView email = holder.getEmail();
    icon.setBackgroundResource(R.drawable.contact_icon);
    name.setText(cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME)));


    final int contactid = cursor.getInt(cursor.getColumnIndex("_id"));
    mHandler.post(new Runnable() {

        @Override
        public void run() {
            Cursor emailCursor = getContentResolver().query(ContactsContract.CommonDataKinds.Email.CONTENT_URI, null, "contact_id=?", new String[]{String.valueOf(contactid)}, null);
            startManagingCursor(emailCursor);
//          Log.i("cursor:", emailCursor.getCount()+"");
            if(emailCursor!=null){

                if(emailCursor.getCount()==0){
                    email.setText("");
                }else {
                    while(emailCursor.moveToNext()){
                        String emails = emailCursor.getString(emailCursor.getColumnIndex("data1"));
                        email.setText(emails);
                    }
                }

            }
            emailCursor.close();
        }
    });

вы бы использовали ContactsContract.CommonDataKinds.Phone.CONTENT_URI вместо ContactsContract.CommonDataKinds.Email.CONTENT_URI.

0 голосов
/ 15 августа 2011

другой пример:

       ListView myListView = (ListView)findViewById(R.id.myListView);

   Cursor cur = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, null, null, null);

   startManagingCursor(cur);


   ListAdapter adapter = new SimpleCursorAdapter(this,
   android.R.layout.simple_list_item_2,
   cur,
   new String[]{ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME, ContactsContract.CommonDataKinds.Phone.NUMBER},new int[] {android.R.id.text1, android.R.id.text2});
   myListView.setAdapter(adapter);
0 голосов
/ 06 января 2011

Вы можете использовать Hashmap для кэширования данных, запустить фоновый поток для кэширования данных контактов в HashMap и извлекать их из hashmap, когда это необходимо.Это сократит время запроса, когда потребуется информация.

...