Android:快速查找联系人列表

问题描述:

我目前正在开发一个应用程序,它需要通过电话号码查找多个联系人(姓名和照片)。 然而,这需要几秒钟(对于每个联系人:通过他们的电话号码查找联系人,获取联系人的名字&照片)。Android:快速查找联系人列表

什么是一个很好的策略来加速这个过程?我意识到我可以使用我自己的sqlite数据库,其中包含我需要的那些名称和照片的列表。有了这样的数据库,我只能做一个查询,然后获取我需要的所有联系人的数据。然而,这会增加一些我希望避免的开销。

有没有更好的(说:更简单)解决方案?

谢谢。

+0

梅特,您可以张贴你如何实现这样的代码,也许我们可以提供一些深入了解如何更好地优化你的工作是什么。 – Webnet 2011-01-06 02:26:00

可以使用的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.Email.CONTENT_URI ContactsContract.CommonDataKinds.Phone.CONTENT_URI。

+0

谢谢你的队友。然而,这个问题已经有7个月的时间了,而且这个项目早已完成。 – metter 2011-08-29 10:40:17

+0

@metter我认为getmsg回答了这个问题,因为你没有回答这个问题。 ;-) – kay 2012-06-30 21:33:28

您可以使用Hashmap缓存数据,运行后台线程以缓存HashMap中的联系人数据,并在必要时从hashmap中获取它。这将减少需要信息时的查询时间。例如

另一个例子:

 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);