0

このコードを使用してAndroid.byにすべての電話番号とメールを取得しようとしています。多数の連絡先を取得しています

enter code here 

      String KEY_NAME = "Name"; 
      String KEY_NO = "No"; 

    String selection = ContactsContract.CommonDataKinds.Phone.IN_VISIBLE_GROUP + " = 1"; 
    String sortOrder = ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME + " COLLATE LOCALIZED ASC"; 


    String data=""; 
    String name=""; 
    ContactEntry contactObj; 
    String id; 

    List<String> temp = new ArrayList<String>(); 

    final String[] projection = new String[]{ContactsContract.Contacts._ID , ContactsContract.Contacts.DISPLAY_NAME , ContactsContract.Contacts.HAS_PHONE_NUMBER}; 

    final String[] email_projection = new String[] {ContactsContract.CommonDataKinds.Email.DATA , ContactsContract.CommonDataKinds.Email.TYPE}; 

    final String[] phone_projection = new String[] {ContactsContract.CommonDataKinds.Phone.NUMBER, ContactsContract.CommonDataKinds.Phone.TYPE}; 

    ContentResolver cr = context.getContentResolver(); 
    Cursor cur = cr.query(ContactsContract.Contacts.CONTENT_URI , projection , selection , null , sortOrder); 

    if(cur.getCount()>0){ 

     while(cur.moveToNext()){ 

      id = cur.getString(cur.getColumnIndex(ContactsContract.Contacts._ID)); 
      name = cur.getString(cur.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME)); 

      if (Integer.parseInt(cur.getString(cur.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER))) > 0) { 

       // get the phone number 
       Cursor pCur = cr.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI , phone_projection , 
             ContactsContract.CommonDataKinds.Phone.CONTACT_ID +" = ?",new String[]{id}, null); 

       while (pCur.moveToNext()){ 

         data = pCur.getString(pCur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)); 

         if(!temp.contains(data) && !data.equals(null)){ 

         } 
       } 
        pCur.close(); 
      } 

      Cursor emailCur = cr.query(ContactsContract.CommonDataKinds.Email.CONTENT_URI, email_projection, 
             ContactsContract.CommonDataKinds.Email.CONTACT_ID + " = ?", new String[]{id}, null); 

      while (emailCur.moveToNext()){ 


       data = emailCur.getString(emailCur.getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA)); 

       if(!temp.contains(data) && !data.equals(null)){    

       } 
      } 
      emailCur.close(); 

     } 

    } 

このコードはうまくいきます。多数の連絡先について5000件の連絡先があれば、UIスレッドをブロックします。これらの連絡先をすべて表示するためのListAdapterを作成します。バックグラウンドで連絡先をすべて取得すると、長い時間の空のリストが表示されます。いくつかの解決策を提案する

答えて

1

コンタクトの数がかなり少なくても、私は非常に似た問題を抱えていました。

リストビューにすべての連絡先を入力し、ユーザーが選択できるようにする必要がありました。最初は、すべての連絡先情報をリストビューに読み込んでいました。しかし、これは本当に多くのクエリを必要としました。これは実際には遅いです。

デザインを変更しました。連絡先の名前と連絡先IDのみを選択し、オブジェクトに記録しました。その後、私のアプリのユーザーが連絡先を選択したとき、私は彼のデータだけをロードしました。これは、(予想通り)大幅に速くなりました。私が実際には必要としなかった多くの情報(つまり、選択されていないすべての連絡先の電話番号と電子メール)を照会していたため、私の場合は完全に機能しました。

同様に、あなたのアプリを再設計することができたら幸いです。しかし、リストビューの変数dataの内容をすぐに表示する必要がある場合は、アダプターを使用して遅延ロードリストビューを表示する必要があります(高速スクロールでもスムーズに実行されることを期待してください)。

+0

はい私は、リストビューで連絡先の名前と共にすべてのデータを表示したいと思います。アダプターを使用してレイジーローディングリストビューについて詳しく説明してください。また、いくつかの例やチュートリアルに転送することもできます。 Answer – Khushwant

+0

トピックに関する簡単なチュートリアルがあります:http://www.softwarepassion.com/android-series-custom-listview-items-and-adapters/うまくいけばそれはあなたを始めさせるでしょう。考えられるのは、ビューが呼び出されたときにアイテムがロードされるということです。これは、アイテムが表示されたときにのみ発生すると考えられます。 –

+0

チュートリアルに感謝します。しかし、このチュートリアルではUIがブロックされており、私はこれを望んでいません。 – Khushwant

関連する問題