【发布时间】:2012-03-09 13:10:07
【问题描述】:
我正在使用光标获取联系人数据并尝试将其加载到 ListView 中
我基于QuickContact APIDemos 示例(API 级别 8)开发了我的代码
这是我的代码,我做了一些修改,但我正面临性能问题 如果我删除联系人照片代码,那么性能会很好,否则它就像拖动列表一样太慢
适配器代码
private class ContactListAdapter extends ResourceCursorAdapter{
Cursor cur;
public ContactListAdapter(Context context, int layout, Cursor c) {
super(context, layout, c);
cur = c;
// TODO Auto-generated constructor stub
}
@Override
public void bindView(View view, Context arg1, Cursor arg2) {
// TODO Auto-generated method stub
final ContactListItemCache cache = (ContactListItemCache) view.getTag();
TextView nameView = cache.nameView;
QuickContactBadge photoView = cache.photoView;
cur.copyStringToBuffer(cur.getColumnIndexOrThrow(ContactsContract.Contacts.DISPLAY_NAME), cache.nameBuffer);
int size = cache.nameBuffer.sizeCopied;
cache.nameView.setText(cache.nameBuffer.data, 0, size);
long contactId = cur.getLong(cur.getColumnIndex(ContactsContract.Contacts._ID));
Uri contactUri = Uri.withAppendedPath(ContactsContract.Contacts.CONTENT_URI, String.valueOf(contactId));
InputStream input = ContactsContract.Contacts.openContactPhotoInputStream(getContentResolver(), contactUri);
cache.photoView.setImageBitmap(BitmapFactory.decodeStream(input));
}
@Override
public View newView(Context context, Cursor cursor, ViewGroup parent) {
View view = super.newView(context, cursor, parent);
ContactListItemCache cache = new ContactListItemCache();
cache.nameView = (TextView) view.findViewById(R.id.name);
cache.photoView = (QuickContactBadge) view.findViewById(R.id.badge);
view.setTag(cache);
return view;
}
}
final static class ContactListItemCache {
public TextView nameView;
public QuickContactBadge photoView;
public CharArrayBuffer nameBuffer = new CharArrayBuffer(128);
}
}
获取联系代码
private Cursor getContacts()
{
// Run query
Uri uri = ContactsContract.Contacts.CONTENT_URI;
String[] projection = new String[] {
ContactsContract.Contacts._ID,
ContactsContract.Contacts.DISPLAY_NAME,
ContactsContract.Contacts.LOOKUP_KEY
};
String selection = ContactsContract.Contacts.IN_VISIBLE_GROUP + " = '" +
(mShowInvisible ? "0" : "1") + "'";
String[] selectionArgs = null;
String sortOrder = ContactsContract.Contacts.DISPLAY_NAME + " COLLATE LOCALIZED ASC";
return managedQuery(uri, projection, selection, selectionArgs, sortOrder);
}
注意: 我经历了这个线程,但我们都使用不同的方法 Load contact photo in a listview performance
编辑
我已经把它写在下面的代码中,但是调用了
imageDownloader.download(contactUri,
(ImageView) cache.photoView ,
getContentResolver(),
contactId);
下载图片代码
Bitmap downloadBitmap(Uri url) {
final int IO_BUFFER_SIZE = 4 * 1024;
InputStream inputStream = null;
try {
inputStream = ContactsContract.Contacts.openContactPhotoInputStream(resolver, url);
if(inputStream ==null){
return BitmapFactory.decodeStream(inputStream);
}else
{
return BitmapFactory.decodeStream(new FlushedInputStream(inputStream));
}
// return BitmapFactory.decodeStream(inputStream);
// Bug on slow connections, fixed in future release.
} finally {
if (inputStream != null) {
try {
inputStream.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
但我使用此代码的问题是几秒钟后我快速向下滚动 QuickBadgeContact 小部件正在加载,在此之前 QuickBadgeContact 的占位符中没有任何内容。
看图
有时图像会在很长一段时间后出现,请看这里
所以它的工作方式与Android中的Contact ListView不一样,如果我们滚动得更快,那么默认情况下QuickBadgeContact将在那里并充当占位符,QuickBadgeContact中的图像稍后会加载,但在我的代码中,整个徽章出现在之后几秒
我只需要继续将图像加载到有照片的联系人,并让其他人保持不变,因为这是加载黑色位图,没有为用户找到图像,但我不知道该怎么做?
【问题讨论】:
标签: android android-widget bitmap android-listview