Я извлекаю контактные данные с помощью курсора и пытаюсь загрузить их в 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);
}
Примечание: я прошел эту тему, но мы оба используем разные подходы Загрузитьфотография контакта в представлении со списком
РЕДАКТИРОВАТЬ
Я записал следующий код, но позвонил
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 ничего не появляется.
см. Изображение
иногда изображения появляются довольно долго, смотрите здесь
, поэтому егоне работает так, как работает Contact ListView в Android, если мы прокручиваем намного быстрее, то также QuickBadgeContact будет там по умолчанию и выступать в качестве заполнителя, изображение внутри QuickBadgeContact загружается позже, но в моем коде весь значок появляется через несколько секунд
Мне просто нужно продолжать загружать изображения в контакт, у которого есть фотография, и оставить нетронутым другой, так как он загружает ЧЕРНОЕ растровое изображение, где для пользователя не найдено изображение, но я не знаю, как мне это сделать?