我目前正在开发一款应用程序,需要通过电话号码查找多个联系人(姓名和照片)。 但是,这需要几秒钟(对于每个联系人:通过他们的电话号码查找联系人,获取联系人的姓名和照片)。
加快这一进程的好策略是什么?我意识到我可以使用我自己的sqlite数据库,其中包含我需要的那些名称和照片的列表。使用这样的数据库,我只能进行一次查询,然后立即获取我需要的所有联系人的数据。然而,这会增加一些我希望避免的开销。
是否有更好的(说话更简单)解决方案?
谢谢。
答案 0 :(得分:1)
您可以使用CursorAdapter并覆盖bindView()方法,例如:
@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();
}
});
您将使用ContactsContract.CommonDataKinds.Phone.CONTENT_URI而不是ContactsContract.CommonDataKinds.Email.CONTENT_URI。
答案 1 :(得分:0)
您可以使用Hashmap缓存数据,运行后台线程以在HashMap中缓存联系人数据,并在必要时从hashmap中获取它。当需要信息时,它将减少查询时间。
答案 2 :(得分:0)
另一个例子:
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);