2011-01-05 14 views
2

私は現在、電話番号で連絡先(名前と写真)を検索する必要のあるアプリケーションを開発中です。 ただし、これには数秒かかります(連絡先ごとに:電話番号で連絡先を検索し、連絡先の名前は&写真)。Android:すばやく連絡先のリストを検索

この処理を高速化するにはどのような方法が良いでしょうか?私は、私が必要とするそれらの名前と写真のリストを含む私自身のsqliteデータベースを使うことができることを認識しています。このようなデータベースでは、1つのクエリしか実行できず、必要なすべての連絡先のデータを一度に取得できます。これは、私が避けたいと思っているかなりのオーバーヘッドを追加します。

もっと良い(話す:より簡単な)ソリューションはありますか?

ありがとうございます。

+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の連絡先データをキャッシュし、必要に応じてハッシュマップからフェッチすることができます。情報が必要な場合は、クエリ時間が短縮されます。

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); 
関連する問題