Android: cercare rapidamente un elenco di contatti
-
25-09-2019 - |
Domanda
Attualmente sto sviluppando un app che ha bisogno di cercare un numero di contatti (nome e foto) tramite il loro numero di telefono. Tuttavia, questo richiede alcuni secondi (Per ogni contatto: Cercare il contatto tramite il loro numero di telefono, ottenere il nome del contatto e foto).
Quale potrebbe essere una buona strategia per accelerare questo processo? Mi rendo conto che avrei potuto usare il mio db SQLite, che contiene un elenco di esattamente quei nomi e le foto di cui ho bisogno. Con una tale banca dati ho potuto fare solo una query, quindi ottenere i dati per tutti i contatti di cui ho bisogno in una sola volta. Questo però dovrebbe aggiungere un po 'di testa Sto sperando di evitare.
C'è un migliore (parlare: più semplice)? Soluzione
Grazie.
Soluzione
è possibile utilizzare CursorAdapter e sovrascrivere Bindview () metodo per esempio:
@Override
public void bindView(final View view, Context context, final Cursor cursor) {
holder = (ItemHolder) view.getTag();
ImageView icon = holder.getImageView();
TextView name = holder.getName();
final TextView email = holder.getEmail();
icon.setBackgroundResource(R.drawable.contact_icon);
name.setText(cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME)));
final int contactid = cursor.getInt(cursor.getColumnIndex("_id"));
mHandler.post(new Runnable() {
@Override
public void run() {
Cursor emailCursor = getContentResolver().query(ContactsContract.CommonDataKinds.Email.CONTENT_URI, null, "contact_id=?", new String[]{String.valueOf(contactid)}, null);
startManagingCursor(emailCursor);
// Log.i("cursor:", emailCursor.getCount()+"");
if(emailCursor!=null){
if(emailCursor.getCount()==0){
email.setText("");
}else {
while(emailCursor.moveToNext()){
String emails = emailCursor.getString(emailCursor.getColumnIndex("data1"));
email.setText(emails);
}
}
}
emailCursor.close();
}
});
si userebbe ContactsContract.CommonDataKinds.Phone.CONTENT_URI invece di ContactsContract.CommonDataKinds.Email.CONTENT_URI.
Altri suggerimenti
È possibile utilizzare HashMap per memorizzare nella cache i dati, eseguire un thread in background per memorizzare nella cache i dati dei contatti in HashMap e prenderlo da hashmap quando mai necessario. Esso contribuirà a ridurre interrogazione momento in cui sono necessarie informazioni.
Un altro esempio:
ListView myListView = (ListView)findViewById(R.id.myListView);
Cursor cur = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, null, null, null);
startManagingCursor(cur);
ListAdapter adapter = new SimpleCursorAdapter(this,
android.R.layout.simple_list_item_2,
cur,
new String[]{ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME, ContactsContract.CommonDataKinds.Phone.NUMBER},new int[] {android.R.id.text1, android.R.id.text2});
myListView.setAdapter(adapter);