2011-01-05 2 views
2

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

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

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

спасибо.

+0

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

ответ

1

вы можете использовать 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

Спасибо, друг. Однако этот вопрос составляет 7 месяцев, и этот проект уже давно завершен. – metter

+0

@metter Я думаю, что все лучше, что getmsg ответил на этот вопрос, так как вы этого не сделали. ;-) – kay

0

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

0

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

 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); 
Смежные вопросы