【问题标题】:Android: Quickly look up a list of contactsAndroid:快速查找联系人列表
【发布时间】:2011-01-05 14:26:45
【问题描述】:

我目前正在开发一个应用程序,该应用程序需要通过他们的电话号码查找一些联系人(姓名和照片)。 但是,这需要几秒钟(对于每个联系人:通过他们的电话号码查找联系人,获取联系人的姓名和照片)。

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

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

谢谢。

【问题讨论】:

  • metter,您能否发布一些有关您如何实现这一目标的代码,也许我们可以提供一些关于如何更好地优化您正在处理的工作的见解。

标签: android database contact android-contentprovider


【解决方案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。

【讨论】:

  • 谢谢你,伙计。然而,这个问题已有 7 个月的历史,并且该项目早已完成。
  • @metter 我认为 getmsg 回答了这个问题更好,因为你没有。 ;-)
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    另一个例子:

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

    【讨论】:

      猜你喜欢
      • 2010-12-26
      • 1970-01-01
      • 1970-01-01
      • 2018-08-07
      • 1970-01-01
      • 1970-01-01
      • 2014-07-25
      • 1970-01-01
      • 2022-11-17
      相关资源
      最近更新 更多