Загрузка фотографий контактов в список контактов: случайные фотографии контактов отображаются в неправильных местах

#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) . Спасибо за помощь!