¿Cómo evitar el nombre de contacto duplicado (datos) mientras se carga la información de contacto a listview?
Estoy rellenando los detalles de la lista de contactos para ver la lista correctamente. Mi código:
String order = ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME + " ASC"; Cursor curLog = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null,null,null,order);
¿Cómo puedo evitar los datos duplicados en la vista de lista como los detalles de contacto se repite si su contacto unido, es decir, unido con el teléfono y Google? . La pantalla es como
- Llamada de la aplicación Android Sip desde Contactos / Agenda
- Utilizar autocompletar texto con número de teléfono de contactos
- Cómo ordenar por nombre y apellido en la barra de búsqueda - Sqlite
- Obtener número del selector de contactos
- Selecciona el contacto directamente desde el selector de contactos
Quiero seleccionar programaticamente sólo 1 nombre no los dos? ¿Alguna idea de cómo puedo seleccionar?
- Cómo comparar una Lista de Arrays con un contacto móvil
- Agrupar por en ContentResolver en Ice Cream Sandwich
- Obtener contactos de un grupo especificado en android
- Modificación de la información de contacto
- Android: contacto de búsqueda basado en número de teléfono
- Insertar intención de contacto, múltiples tipos de teléfono / correo electrónico / etc?
- Android obtener foto de contacto, nombre y número de móvil
- Agregar un contacto a través de adb o monkeyrunner
He utilizado una manera áspera de evitar este problema que me ayudó tanto y que trabajaba agradable.
es decir
Utilice la base de datos local (SQLite) para evitar datos duplicados haciendo que el número de teléfono sea único.
He hecho un SQLite DB para manejar este problema:
ContactMerger.java:
public class ContactMerger { private static final String CONTACT_TABLE = "_contact_table"; private static final String CONTACT_ID = "_contactId"; private static final String CONTACT_NAME = "_contactName"; private static final String CONTACT_MOBILE_NUMBER = "_contactNumber"; private static final String CONTACT_DATE = "_contactDate"; private static final int DATABASE_VERSION = 1; private static final String DATABASE_NAME = "DB_Contact"; private final Context context; private SQLiteDatabase ourDatabase; private DbHelper ourHelper; private class DbHelper extends SQLiteOpenHelper { public DbHelper(Context context) { super(context, DATABASE_NAME, null, DATABASE_VERSION); } @Override public void onCreate(SQLiteDatabase db) { // TODO Auto-generated method stub String contactQuery = "CREATE TABLE " + CONTACT_TABLE + " (" + CONTACT_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " + CONTACT_NAME + " TEXT NOT NULL, " + CONTACT_DATE + " TEXT NOT NULL, " + CONTACT_MOBILE_NUMBER + " TEXT NOT NULL UNIQUE);"; db.execSQL(contactQuery); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { // TODO Auto-generated method stub db.execSQL("DROP TABLE IF EXISTS " + CONTACT_TABLE); onCreate(db); } } public ContactMerger(Context context) { this.context = context; } public ContactMerger open() throws SQLException { ourHelper = new DbHelper(context); ourDatabase = ourHelper.getWritableDatabase(); return this; } public void close() { ourHelper.close(); } // Insert Data to Contact Table public long insertContacts(String name, String number, String date) throws SQLException { ContentValues cv = new ContentValues(); cv.put(CONTACT_NAME, name); cv.put(CONTACT_DATE, date); cv.put(CONTACT_MOBILE_NUMBER, number); Log.d("Insert Data", cv.toString()); return ourDatabase.insert(CONTACT_TABLE, null, cv); } //Get Contact details from Contact Table public ArrayList<ContactHolder> getContactDetails() throws Exception{ ArrayList<ContactHolder> contactDetails = new ArrayList<ContactHolder>(); String[] columns = new String[] { CONTACT_ID, CONTACT_NAME, CONTACT_DATE, CONTACT_MOBILE_NUMBER }; Cursor c = ourDatabase.query(CONTACT_TABLE, columns, null, null, null,null, null); int iContactName = c.getColumnIndex(CONTACT_NAME); int iContactDate = c.getColumnIndex(CONTACT_DATE); int iContactMobileNumber = c.getColumnIndex(CONTACT_MOBILE_NUMBER); for (c.moveToFirst(); !c.isAfterLast(); c.moveToNext()) { ContactHolder data = new ContactHolder(); data.setName(c.getString(iContactName)); data.setDate(c.getString(iContactDate)); data.setNumber(c.getString(iContactMobileNumber)); contactDetails.add(data); } return contactDetails; } }
Aquí ContactHolder
es sólo una clase getter / setter para manejar entidades de contacto.
Primero inserté toda la información de contacto una vez en MainActivity con la ayuda de un hilo de fondo. Evita insertar la información de contacto varias veces.
Algo como:
private ArrayList<ContactHolder> contactHolder; private void setCallLogs(Cursor managedCursor) { contactHolder = new ArrayList<ContactHolder>(); int _number = managedCursor .getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER); int _name = managedCursor .getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME); int _id = managedCursor .getColumnIndex(ContactsContract.CommonDataKinds.Phone._ID); while (managedCursor.moveToNext()) { ContactHolder holder = new ContactHolder(); holder.setNumber(managedCursor.getString(_number)); holder.setName(managedCursor.getString(_name)); holder.setDate(managedCursor.getString(_id)); contactHolder.add(holder); } Thread t = new Thread(new Runnable() { @Override public void run() { for(int i=0; i<contactHolder.size(); i++){ try{ ContactMerger merger = new ContactMerger(HomeActivity.this); merger.open(); merger.insertContacts(contactHolder.get(i).getName(), contactHolder.get(i).getNumber(), contactHolder.get(i).getdate()); merger.close(); } catch(Exception e){ e.printStackTrace(); } } } }); t.start(); }
Por último gtt toda la información de contacto dentro de un Asynctask (doInbackground ()) y poner en el adaptador / listview en su método onPostExecute () en la clase que quiero mostrar.
Aquí:
@Override protected ArrayList<ContactHolder> doInBackground(String... parameters) { ArrayList<ContactHolder> filterContacts = new ArrayList<ContactHolder>(); ContactMerger merger = new ContactMerger(Aaja_Contact.this); merger.open(); try { filterContacts = merger.getContactDetails(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } merger.close(); return filterContacts; }
Necesita recuperar los datos del Cursor a HashSet (que no permite duplicar itmes) y, a continuación, pasar el objeto HashSet a su adaptador ListView
Esta es una solución de volcado, pero le ayudará a:
ListView listView; Set<String> listItems; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); listView = (ListView) findViewById(R.id.listView); listItems = new HashSet<String>(); String order = ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME + " ASC"; Cursor curLog = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null,null,null,order); if(curLog != null) { while(curLog.moveToNext()) { String str = curLog.getString(curLog.getColumnIndexOrThrow(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME_PRIMARY)); listItems.add(str); } } String listString = listItems.toString(); listString = listString.substring(1,listString.length()-1); String[] newList = listString.split(", "); ArrayAdapter<String> adapter = new ArrayAdapter<String>(MainActivity.this, android.R.layout.simple_list_item_1, newList); listView.setAdapter(adapter); }
Buena suerte..
Creo que esto puede suceder si el número de contacto se almacena de dos formas / formatos diferentes: por ejemplo, en su caso el número de Akshay se puede guardar como 982-0123456 y 9820123456
¿Ha intentado mostrar el número junto con el nombre incluyendo el número también en la vista de lista?
Puesto que usted está consultando Phone.CONTENT_URI
, Phone.CONTENT_URI
que usted está buscando contactos con número de teléfono. Entonces usted puede utilizar ContactsContract.Contacts.CONTENT_URI
String order = ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME + " ASC"; Cursor curLog = getContentResolver().query(ContactsContract.Contacts.CONTENT_URI, null, ContactsContract.Contacts.HAS_PHONE_NUMBER + "=?", new String[] { "1" }, order);
Su porque el listview está mostrando contactos normales así como whatsapp (o como esto) los contactos ligados. Lo mejor es almacenar todos los contactos en una base de datos y luego recuperar los contactos mediante el comando "select distinct …" de SQL.
- Android View Visibility GONE
- Creación de una aplicación para Android con targetSdkVersion de 25 y minSdkVersion 19