我目前正在開發一個應用程序,它需要通過電話號碼查找多個聯繫人(姓名和照片)。 然而,這需要幾秒鐘(對於每個聯繫人:通過他們的電話號碼查找聯繫人,獲取聯繫人的名字&照片)。Android:快速查找聯繫人列表
什麼是一個很好的策略來加速這個過程?我意識到我可以使用我自己的sqlite數據庫,其中包含我需要的那些名稱和照片的列表。有了這樣的數據庫,我只能做一個查詢,然後獲取我需要的所有聯繫人的數據。然而,這會增加一些我希望避免的開銷。
有沒有更好的(說:更簡單)解決方案?
謝謝。
我目前正在開發一個應用程序,它需要通過電話號碼查找多個聯繫人(姓名和照片)。 然而,這需要幾秒鐘(對於每個聯繫人:通過他們的電話號碼查找聯繫人,獲取聯繫人的名字&照片)。Android:快速查找聯繫人列表
什麼是一個很好的策略來加速這個過程?我意識到我可以使用我自己的sqlite數據庫,其中包含我需要的那些名稱和照片的列表。有了這樣的數據庫,我只能做一個查詢,然後獲取我需要的所有聯繫人的數據。然而,這會增加一些我希望避免的開銷。
有沒有更好的(說:更簡單)解決方案?
謝謝。
可以使用的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.Email.CONTENT_URI ContactsContract.CommonDataKinds.Phone.CONTENT_URI。
您可以使用Hashmap緩存數據,運行後臺線程以緩存HashMap中的聯繫人數據,並在必要時從hashmap中獲取它。這將減少需要信息時的查詢時間。例如
另一個例子:
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);
梅特,您可以張貼你如何實現這樣的代碼,也許我們可以提供一些深入瞭解如何更好地優化你的工作是什麼。 – Webnet 2011-01-06 02:26:00