2011-12-06 5 views
1

私はいくつかのライトを使うことができると思っただけの質問です。これまでは、特定のタイプのデータ(現在のDISPLAY_NAME、NUMBER、およびADDRESS)についてAndroidの連絡先データベースに問い合わせるアプリケーションがあります。次に、私はカーソルビューの結果をListViewに取り込みます。私の問題は、私は3つの別のカーソルを使用してデータを取得し、私はListViewの行(R.id.contact_name、R.id.contact_number、R.id.連絡先住所)。Androidがマルチビューカーソルでリストビューを設定しています

私は3つの異なるカーソルを使ってこれを行う方法がわかりません。過去のカップルを見回した後、 "MergeCursor?"を使うようないくつかのフレーズを除いて実際のガイダンスは見つかりませんでしたsp)またはデータベーステーブルを一緒に結合しようとしています。また、私はonCreate()の中に自分のリストを入れたくありません。私はAsyncTaskのdoInBackground()内でそれをやりたいのですが、何人かのユーザーがたくさんの連絡先を持ち、UIスレッドをブロックしたくないからです。既に起こっています。しかし、非同期で人口を実装しようとすると、Eclipseは私のSimpleCursorAdapterについて私に多大なエラーをもたらします。ここに私の現在のコードです。どのようにこのアーキテクチャを改善し、私が持っている問題を解決するためのすべての指針は、大変感謝します、ありがとう!

 public class Contacts extends ListActivity { 

    private static final String TAG = "Contacts"; 

    Cursor c, pCur, addrCur; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    // TODO Auto-generated method stub 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    Uri contacts = ContactsContract.Contacts.CONTENT_URI; 
    ContentResolver cr = getContentResolver(); 

    String[] projection = new String[] { ContactsContract.Data.DISPLAY_NAME }; 
    String sortOrder = ContactsContract.Contacts.DISPLAY_NAME 
      + " COLLATE LOCALIZED ASC"; 
    Log.d(TAG, "Getting Display Names...."); 

    // Query the Contacts Content Provider for ONLY Contacts that have phone 
    // numbers 
    // listed 

    c = cr.query(ContactsContract.Contacts.CONTENT_URI, null, 
      ContactsContract.CommonDataKinds.Phone.HAS_PHONE_NUMBER, null, 
      sortOrder); 
    // Get their display names 
    if (c.getCount() > 0) { 
     // While there is more data 
     while (c.moveToNext() 
       && Integer 
         .parseInt(c.getString(c 
           .getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER))) > 0) { 
      String id = c.getString(c 
        .getColumnIndex(ContactsContract.Contacts._ID)); 

      String name = c 
        .getString(c 
          .getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME)); 

      // Query Phone Numbers Next 

      /* 
      * if (Integer .parseInt(c.getString(c 
      * .getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER))) 
      * > 0) { Log.d(TAG, "Getting Phone Numbers"); pCur = cr.query(
      * ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, 
      * ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = ?" , 
      * new String[]{id}, null); while (pCur.moveToNext()) { 
      * 
      * String phone_number = pCur .getString(pCur 
      * .getColumnIndex(ContactsContract 
      * .CommonDataKinds.Phone.NUMBER)); } pCur.close(); Log.d(TAG, 
      * "Finished Getting Phone Numbers...."); } 
      */ 

      // Query the Addresses 
      Log.d(TAG, "Getting Addresses...."); 
      String addrWhere = ContactsContract.Data.CONTACT_ID 
        + " = ? AND " + ContactsContract.Data.MIMETYPE + " = ?"; 

      String[] addWhereParams = new String[] { 
        id, 
        ContactsContract.CommonDataKinds.StructuredPostal.CONTENT_ITEM_TYPE }; 

      addrCur = cr.query(ContactsContract.Data.CONTENT_URI, null, 
        null, null, null); 

      while (addrCur.moveToNext()) { 
       String poBox = addrCur 
         .getString(addrCur 
           .getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.POBOX)); 

       String street = addrCur 
         .getString(addrCur 
           .getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.STREET)); 

       String city = addrCur 
         .getString(addrCur 
           .getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.CITY)); 

       String state = addrCur 
         .getString(addrCur 
           .getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.REGION)); 

       String postalCode = addrCur 
         .getString(addrCur 
           .getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.POSTCODE)); 

       String country = addrCur 
         .getString(addrCur 
           .getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.COUNTRY)); 

       String type = addrCur 
         .getString(addrCur 
           .getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.TYPE)); 

      } 
      addrCur.close(); 
      Log.d(TAG, "Finished Getting Addresses...."); 

     } 
    } 
    // new loadContacts().execute(TAG); 
    final int[] TO = { R.id.contact_name }; 
    final String[] FROM = new String[] { ContactsContract.Contacts.DISPLAY_NAME }; 

    SimpleCursorAdapter adapter = new SimpleCursorAdapter(this, 
      R.layout.contact_item, c, FROM, TO); 
    setListAdapter(adapter); 
    // adapter.changeCursor(pCur); 


} 

@Override 
protected void onListItemClick(ListView l, View v, int position, long id) { 
    // TODO Auto-generated method stub 
    super.onListItemClick(l, v, position, id); 
    c.moveToPosition(position); 

    String name = c.getString(c.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME)); 

    Toast.makeText(this, "You Selected " + name, Toast.LENGTH_SHORT).show(); 





    //Toast t = Toast.makeText(Contacts.this, "You Selected " + position, Toast.LENGTH_SHORT); 
    //t.show(); 
} 

}

+0

あなたは、ListView用に独自のアダプタを定義し、クエリ結果をアダプタにマージする方がよいでしょう。 –

答えて

0

MergeCursorは、別の結果とつのクエリの結果をconcatonatingため以上です。それを列ではなく、列と考えることができます。

(各電話番号からの電話番号、別の電話番号からのアドレス)を使用したい場合は、CursorJoinerです。 CursorJoinerを使用すると、同じ主キーでソートされた2つのカーソルを取得し、各親カーソルから必要な列を持つ新しいCursorを作成できます。リンクされたドキュメントには簡単な概要が含まれています。

幸運を祈る!

EDIT:クエリを別のスレッドで実行する方法については、Loadersでお読みください。

+0

アレックス、ありがとうございます!また、別のスレッドでリストを作成する方法はありますか?私はそれがUIに遅れているので、作成中にそれをしたくありません。再度、感謝します! –

+0

sure-回答を更新して役立つリンクを追加しました。 –

関連する問題