2017-01-27 18 views
0

https://trinitytuts.com/get-contact-list-and-show-in-custom-listview-android/#チュートリアルを使用してリストビューに連絡先リストを取得しています。それはうまくいっていますが、重複する連絡先を与えています。この問題を解決するために、リストビューで一度だけ連絡を取ることができます。カスタムリストビューで重複した連絡先を削除します。

Mainactivityのコードは以下の通りです:

import android.app.Activity; 
import android.content.ContentResolver; 
import android.database.Cursor; 
import android.graphics.Bitmap; 
import android.net.Uri; 
import android.os.AsyncTask; 
import android.os.Bundle; 
import android.provider.ContactsContract; 
import android.provider.MediaStore; 
import android.util.Log; 
import android.view.View; 
import android.widget.AdapterView; 
import android.widget.ListView; 
import android.widget.SearchView; 
import android.widget.Toast; 

import java.io.IOException; 
import java.util.ArrayList; 
import java.util.List; 


public class MainActivity extends Activity { 

    // ArrayList 
    ArrayList<SelectUser> selectUsers; 
    List<SelectUser> temp; 
    // Contact List 
    ListView listView; 
    // Cursor to load contacts list 
    Cursor phones, email; 

    // Pop up 
    ContentResolver resolver; 
    SearchView search; 
    SelectUserAdapter adapter; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     selectUsers = new ArrayList<SelectUser>(); 
     resolver = this.getContentResolver(); 
     listView = (ListView) findViewById(R.id.contacts_list); 

     phones = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, null, null, ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME + " ASC"); 
     LoadContact loadContact = new LoadContact(); 
     loadContact.execute(); 

     search = (SearchView) findViewById(R.id.searchView); 

     //*** setOnQueryTextListener *** 
     search.setOnQueryTextListener(new SearchView.OnQueryTextListener() { 

      @Override 
      public boolean onQueryTextSubmit(String query) { 
       // TODO Auto-generated method stub 

       return false; 
      } 

      @Override 
      public boolean onQueryTextChange(String newText) { 
       // TODO Auto-generated method stub 
       adapter.filter(newText); 
       return false; 
      } 
     }); 
    } 

    // Load data on background 
    class LoadContact extends AsyncTask<Void, Void, Void> { 
     @Override 
     protected void onPreExecute() { 
      super.onPreExecute(); 

     } 

     @Override 
     protected Void doInBackground(Void... voids) { 
      // Get Contact list from Phone 

      if (phones != null) { 
       Log.e("count", "" + phones.getCount()); 
       if (phones.getCount() == 0) { 
        Toast.makeText(MainActivity.this, "No contacts in your contact list.", Toast.LENGTH_LONG).show(); 
       } 

       while (phones.moveToNext()) { 
        Bitmap bit_thumb = null; 
        String id = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.CONTACT_ID)); 
        String name = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME)); 
        String phoneNumber = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)); 
        String EmailAddr = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA2)); 
        String image_thumb = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.PHOTO_THUMBNAIL_URI)); 
        try { 
         if (image_thumb != null) { 
          bit_thumb = MediaStore.Images.Media.getBitmap(resolver, Uri.parse(image_thumb)); 
         } else { 
          Log.e("No Image Thumb", "--------------"); 
         } 
        } catch (IOException e) { 
         e.printStackTrace(); 
        } 

        SelectUser selectUser = new SelectUser(); 
        selectUser.setThumb(bit_thumb); 
        selectUser.setName(name); 
        selectUser.setPhone(phoneNumber); 
        selectUser.setEmail(id); 
        selectUser.setCheckedBox(false); 
        selectUsers.add(selectUser); 
       } 
      } else { 
       Log.e("Cursor close 1", "----------------"); 
      } 
      //phones.close(); 
      return null; 
     } 

     @Override 
     protected void onPostExecute(Void aVoid) { 
      super.onPostExecute(aVoid); 
      adapter = new SelectUserAdapter(selectUsers, MainActivity.this); 
      listView.setAdapter(adapter); 

      // Select item on listclick 
      listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
       @Override 
       public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) { 

        Log.e("search", "here---------------- listener"); 

        SelectUser data = selectUsers.get(i); 
       } 
      }); 

      listView.setFastScrollEnabled(true); 
     } 
    } 

    @Override 
    protected void onStop() { 
     super.onStop(); 
     phones.close(); 
    } 
} 

答えて

2

なぜSetを使用していないObject中とSetObjectその連絡先を保存してみ?。重複を排除する必要があるObjectequalsメソッドをオーバーライドすることを忘れないでください。

ここ

もっと読み連絡先はもっとして1台の携帯電話を持っている場合、あなたは同じ連絡先の複数を得るでしょう、電話ではなく、連絡先のリストの上に照会しているので、あなたが重複する連絡先を見ている http://www.java2novice.com/java-collections-and-util/hashset/duplicate/

+0

をArraylistをHashsetに変更すると、リストのサイズは2973から30になりました。連絡先のほとんどをスキップして、セットで追加します。 – Panache

+0

連絡先を追加する必要があります。次に、連絡先オブジェクトで、equalsメソッドをオーバーライドする必要があります。また、条件をtrueまたはfalseに戻す必要があります。残りはすべて内部で管理されます。 HashSet。 – Nilesh

0

回 - 各電話番号に1つ。

複数の電話機との連絡先を処理する方法と、電話を持たない連絡先(現在は電話がない連絡先を表示していない)を決定する必要があります。

は、あなたが携帯電話を持っている連絡先のみを表示し、連絡先ごとに1行をしたいと仮定すると、同じ行にその連絡先のすべての電話を表示し、あなたのコードビットを修正する必要があります:

  1. SelectUserオブジェクトは、1つではなく、電話機のリストを受け入れる必要があります。
  2. selectUsersフィールドはHashMap<Long, SelectUser>なくArrayList<SelectUser>
  3. String id = ...が実際にその後、あなたのカーソルイテレータでこれを行うLong id = ...

する必要がありますする必要があります:

if (selectUsers.containsKey(id)) { 
    SelectUser selectUser = selectUsers.get(id); 
    selectUser.addPhone(phoneNumber); // new method you need to implement 
} else { 
    SelectUser selectUser = new SelectUser(); 
    selectUser.setThumb(bit_thumb); 
    selectUser.setName(name); 
    selectUser.setPhone(phoneNumber); 
    selectUser.setEmail(id); // Email can't be retrieved from the phones table, see below 
    selectUser.setCheckedBox(false); 
    selectUsers.add(selectUser); 
} 

P.S.を CommonDataKinds.Phoneテーブルを照会するときにCommonDataKinds.Emailフィールドを読み取ることはできません。同じクエリで電話機と電子メールの両方を読み取る場合は、ContactsContract.Dataテーブルを照会し、Data.MIMETYPE + ' = ' + Phone.CONTENT_TYPE + ' OR ' + Data.MIMETYPE + ' = ' + Email.CONTENT_TYPEを選択する必要があります。 これはあなたにいずれか電話またはEメール(あなたがそれである1をチェックするData.MIMETYPEを使用することができますライン上にカーソルを与える

ここで詳細を参照してください:私はちょうど場合https://developer.android.com/reference/android/provider/ContactsContract.Data.html https://stackoverflow.com/a/31864811/819355

関連する問題