2017-01-27 1 views
0

Я использую https://trinitytuts.com/get-contact-list-and-show-in-custom-listview-android/# учебник, чтобы получить список контактов в виде списка. Он работает нормально, но дает дубликаты контактов. Может ли кто-нибудь руководствоваться этим, чтобы разрешить и получить контакт один раз только в списке.Удалить дубликаты контактов в пользовательском listview

Код для 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 и что Object в Set?. Не забудьте переопределить метод equals этого Object, на основе которого вам необходимо устранить дубликаты.

Больше чтения здесь http://www.java2novice.com/java-collections-and-util/hashset/duplicate/

+0

, если я просто измените Arraylist на Hashset, сохраняя все одинаковое, размер списка достиг 30 от 2973. Таким образом, пропуск большинства контактов будет добавлен в набор. Как это можно использовать. – Panache

+0

Вам нужно будет добавить свои контакты для отображения в Object ie Contacts объект (скажем). Затем в объекте контактов вам нужно переопределить методы equals и на основе любых критериев вам нужно будет вернуть true или false. Остальное все будет управляться внутренне HashSet. – Nilesh

0

Вы видите повторяющиеся контакты, потому что вы запрашивая через список телефонов, а не контактов, если контакт имеет более одного телефона, вы получите тот же контакт мультипликатор раз - по одному для каждого номера телефона.

Вам необходимо решить, как вы хотите обращаться с контактами с несколькими телефонами, а также контакты без телефона (в настоящее время вы не показываете контакты, у которых нет телефона).

Предполагая вы хотите одну строки на контакт, показывая только те контакты, которые имеют телефоны, и отображение все телефоны для контакта на ту же строку, вам нужно пересмотреть ваш код немного:

  1. Объект SelectUser должен принять список телефонов, а не только один.
  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.Email при запросе таблицы CommonDataKinds.Phone, если вы хотите прочитать как телефоны, так и электронные письма по одному и тому же запросу, вам нужно запросить таблицу ContactsContract.Data и выбрать для Data.MIMETYPE + ' = ' + Phone.CONTENT_TYPE + ' OR ' + Data.MIMETYPE + ' = ' + Email.CONTENT_TYPE. Это даст вам курсор на линии, которые либо телефон или по электронной почте (вы можете использовать Data.MIMETYPE, чтобы проверить, какой из его

Смотреть подробнее здесь:. https://developer.android.com/reference/android/provider/ContactsContract.Data.html https://stackoverflow.com/a/31864811/819355