0

これは単純な使用例のようですが、これを行う方法を理解できません。 Androidの電話のすべての連絡先をすべての電話番号とともに取得したいと思います。 さんが言ってみましょう自分の電話番号と一緒に自分の携帯電話に連絡先のリストを以下に示します。CursorLoaderを使用して複数の電話番号の連絡先を表示

A - 1111(モバイル)、2222(ホーム)、3333(作業)

B - 4444(モバイル)、5555 (ホーム)

C

から6666(モバイル)、7777(ホーム)、8888(作業)

私は、次の方法で連絡先を表示したいがCursorLoaderを使用。私が試してみました

enter image description here

もの:

  • 時にすべての連絡先や自分の電話番号を取得し、カスタムの連絡先オブジェクトの配列リストに保存して、リストを表示するためにそれらを使用しますRecyclerView。
    • この問題は、電話番号が多い場合、この画面に再度アクセスすると、リソースが空きでないかメモリリークの問題が原因で空の画面が表示されることがあります。

StackOverflowのはそうここにあるコードを正しくインデントしません。https://pastebin.com/y9i5R5iN

final Uri uri = Uri.withAppendedPath(ContactsContract.Contacts.CONTENT_URI, String.valueOf(contactListCursor.getLong(ContactsQuery.ID))); 
        Uri thisContactUri = ContactsContract.Contacts.lookupContact(context.getContentResolver(), uri); 
        final UserContact contact = new UserContact(); 
        contact.setName(contactListCursor.getString(contactListCursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME))); 
        final ArrayList<PhoneType> multipleContacts = new ArrayList<>(); 
        final Uri phoneNumUri = Uri.withAppendedPath(thisContactUri, ContactsContract.Contacts.Data.CONTENT_DIRECTORY); 
        final Cursor contactPhoneNumCursor = contentResolver.query(phoneNumUri, ContactPhoneQuery.PROJECTION, ContactPhoneQuery.SELECTION, null, null); 
  • はContactsContract.Contacts.CONTENT_URIを照会することによりCursorLoaderとCursorAdapterを使用して、すべての連絡先を入手IDとDISPLAY_NAME_PRIMARYを取得します。 getView()メソッドでは、最初のカーソルが私に与えた連絡先の詳細を呼び出すために、2番目のCursorLoaderを初期化できると考えました。

ユーザーに複数の連絡先がある場合は、ラジオボタンの一覧を表示し、そうでない場合は、唯一の番号のテキストビューを表示します。

私のコードはここにある:https://bitbucket.org/soulpatch/contactlistdemo/src/7c49c1e79fbbd7da90630c8967ae6daffa4efd72/?at=first_draft

これは、事前に電話番号をロードし、後でビューを更新しないように思われます。遅延や何かがわからないからです。 誰かがこれを手伝ってくれますか? チェック

答えて

0

これを行う方法が見つかりました。 CursorLoaderを使用して、連絡先の初期クエリ用のCustomAdapterに渡し、_IDフィールドを使用して連絡先を検索し、連絡先のURIを作成し、CustomAdapterのgetViewメソッド自体の中で電話固有の詳細を検索しました。

私はCursorLoadersを両方で使用するか、両方でバルクロードを使用しようとしていました。ハイブリッドアプローチが最も効果的でした。

これは誰かを助けることを望みます。 :)

+0

getViewでカーソルの読み込みを実際に避ける必要があります。これは一部のデバイスにとって恐ろしいパフォーマンスをもたらします。悪いスクロールパフォーマンス。私は時間があれば明日より単純なソリューションを投稿します – marmor

+0

はい私は同意し、古い電話機のいくつかをスクロールしながらパフォーマンスの問題を見ていますが、カーソルをgetViewで読み込まないようにすべきだと言ったら、 2番目の部分で_IDフィールドを検索し、連絡先のすべての電話番号を取得しますか?または、リストビューのCustomAdapterでカーソルローダーを使用しないでください。 Androidの開発者ページの例では、カーソルを使用して連絡先名をロードし、2番目のカーソルを使用してonClickの詳細を取得するためです。古いデバイスのスクロールをスムーズにするために、より良い方法を提案できると嬉しいです。 – LeoNeo

0

データベース内のすべての電話番号を連絡先IDと連絡先名と共に取得することができます。

すべてのデータをマップに保存します(contact-id => name、phone、...) カスタムアダプタを使用して、マップを連絡先リストとして表示します。

Map<Long, List<String>> contacts = new HashMap<Long, List<String>>(); 

String[] projection = { Data.CONTACT_ID, Data.DISPLAY_NAME, Data.MIMETYPE, Data.DATA1, Data.DATA2, Data.DATA3 }; 
String selection = Data.MIMETYPE + " IN ('" + Phone.CONTENT_ITEM_TYPE + "')"; 
Cursor cur = cr.query(Data.CONTENT_URI, projection, selection, null, null); 

while (cur != null && cur.moveToNext()) { 
    long id = cur.getLong(0); 
    String name = cur.getString(1); 
    String mime = cur.getString(2); // type of data (e.g. "phone") 
    String data = cur.getString(3); // the actual info, e.g. +1-212-555-1234 
    int type = cur.getInt(4); // a numeric value representing type: e.g. home/office/personal 
    String label = cur.getString(5); // a custom label in case type is "TYPE_CUSTOM" 

    String labelStr = Phone.getTypeLabel(getResources(), type, label); 
    Log.d(TAG, "got " + id + ", " + name + ", " + kind + " - " + data + " (" + labelStr + ")"); 

    // add info to existing list if this contact-id was already found, or create a new list in case it's new 
    List<String> infos; 
    if (contacts.containsKey(id)) { 
     infos = contacts.get(id); 
    } else { 
     infos = new ArrayList<String>(); 
     infos.add("name = " + name); 
     contacts.put(id, infos); 
    } 
    infos.add(kind + " = " + data + " (" + labelStr + ")"); 
} 

注:マップの値は、単にコード - のために、文字列のリストである。ここ

は接触-IDと名前(あなたが ContactsContractからすべてをインポートすることを確認してください)と一緒にすべての電話を照会するためのコードです明快さ。適切なJavaオブジェクト内の電話機の名前とリストを保持するカスタム Contactオブジェクトに変更する必要があります

+0

私は以前これをやってみましたが、電話機が600-1000の範囲で多くの連絡先を持っている場合、1)連絡先リソースがフリーズします。したがって、連絡先リスト画面の切り替えは、空白の画面になります。 2)また、画面の応答性が低下します。 3)ヒープスペースを占有する可能性があり、GC化された場合は、画面がロードされているときにリロードを呼び出す必要があります。私の理解が間違っていると私を訂正してください – LeoNeo

+0

メインスレッドでクエリを実行しようとしているようで、画面に読み込みアニメーションを表示し、連絡先マップを 'AsyncTask'にロードする必要があります。ユーザーが画面に入る前にリストを表示して、読み込み時間を減らすか、または排除します。 – marmor

関連する問題