#java #android #simplecursoradapter #contactscontract
#java #Android #simplecursoradapter #contactscontract
Вопрос:
Я загрузил свои контакты в список, используя расширенный SimpleCursorAdapter, и теперь я пытаюсь загрузить фотографии контактов. При запуске кода случайные фотографии контактов отображаются рядом со случайными контактами, даже для тех, у кого нет фотографий. Почему он просто не получает фотографии для тех контактов, у которых они есть, и не показывает рядом с ними?
Вот код:
public void bindView(View view, Context context, Cursor cursor) {
ImageView photo = (ImageView) findViewById(R.id.photo);
long photoId = cursor.getLong(cursor.getColumnIndex(ContactsContract.Contacts.PHOTO_ID));
Bitmap photoBitmap = loadContactPhoto(photoId);
if (photoBitmap != null) {
photo.setImageBitmap(photoBitmap);
}
И код для загрузки contactphoto:
public Bitmap loadContactPhoto(long id) {
Uri contactUri = ContentUris.withAppendedId(ContactsContract.Data.CONTENT_URI, id);
byte[] data = null;
Cursor cursor = managedQuery(
contactUri, // Uri
new String[] { ContactsContract.CommonDataKinds.Photo.PHOTO }, // projection, the contact photo
ContactsContract.Contacts.PHOTO_ID "!= 0", // where statement, only if the contact has a photo
null, null);
Log.i(LOG_TAG, "cursorCount: " cursor.getCount()); // returns 1
if (cursor == null || !cursor.moveToNext()) {
return null;
}
data = cursor.getBlob(0);
Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0, data.length);
return bitmap;
}
Комментарии:
1. Как вы реализовали «Просмотр вида»?
Ответ №1:
В BindView() вы вызываете:
ImageView photo = (ImageView) findViewById(R.id.photo);
Разве вы не должны вызывать findViewById() в параметре view?
ImageView photo = (ImageView) view.findViewById(R.id.photo);
Комментарии:
1. да, спасибо! Это частично решило проблему — теперь рядом с правильными контактами отображаются правильные фотографии. Но я все равно получаю случайные фотографии рядом со случайными другими контактами, у которых нет фотографий контактов. Есть идеи?
2. Чтобы уточнить, это происходит, когда я начинаю прокручивать список. Может быть, это из-за getView или NewView, должен ли я их перезаписывать или что-то в этом роде?
3. Найден и другой виновник — мой BindView перерабатывал строки, поэтому ранее загруженные фотографии появлялись в случайных других строках. Исправлено путем добавления
else
инструкции вif (photoBitmap != null)
. Спасибо за помощь!