Android ListView: как избежать запроса к базе данных в bindView()? Необходимо получить данные отношения один ко многим

У меня есть представление списка для отображения альбомов. В каждом элементе списка альбомов мне нужно отобразить некоторую информацию о каждой фотографии в этом альбоме. Вот как выглядит мой загрузчик курсора:

@Override
public Loader<Cursor> onCreateLoader(int id, Bundle args) {
    return new CursorLoader(this, AlbumsColumns.CONTENT_URI, null, null, null, null);
}

@Override
public void bindView(View view, Context context, Cursor cursor) {

    long albumId = cursor.getLong(cursor.getColumnIndex(AlbumsColumns._ID));

    Cursor photoCursor = getContentResolver().query(PhotosColumns.CONTENT_URI, null, PhotosColumns.ALBUM_ID + " = ?", 
            new String[]{Long.toString(albumId)}, null);

    if (photoCursor.moveToFirst()){
        do{

            // Here I collect the information from each photo in the album

        }while(photoCursor.moveToNext());
    }

    photoCursor.close();
}

По сути, я позволяю загрузчику курсора управлять запросом альбома, и каждый раз в bindView я запрашиваю фотографии из переданного курсора альбома. Я чувствую, что это может быть проблемой производительности. Есть ли лучший способ сделать это?


comment
Одним из решений может быть собственный загрузчик, который выполняет все эти запросы в фоновом потоке и возвращает список объектов, содержащих необходимую информацию.   -  person dymmeh    schedule 15.01.2014
comment
@dymmeh Да, я только что понял, что это должно быть правильно.   -  person X.Y.    schedule 15.01.2014
comment
Кстати, производительность — это одно. Есть потенциальная ошибка, все обновления фотографий не будут уведомлены, если я сам запросил в bingView()   -  person X.Y.    schedule 15.01.2014


Ответы (1)


Просто появилась идея: использовать другой загрузчик курсора внутри элемента списка. Так что это будет похоже на двухуровневый загрузчик курсора. Я опубликую свои результаты позже.

Изменить:

Предлагаемая идея должна быть правильным способом решения проблемы. Итак, мой код реорганизован следующим образом:

// In the list view activity:

    @Override
    public void bindView(View view, Context context, Cursor cursor) {

        AlbumListItem albumListItem = (AlbumListItem)view;

        albumListItem.prepareView(getLoaderManager(), cursor);
    }

// AlbumListItem is a class that has a cursor loader to query photos:
public class AlbumListItem extends RelativeLayout implements LoaderManager.LoaderCallbacks<Cursor>{


public void prepareView(LoaderManager loaderManager, Cursor albumCursor){

    albumId = albumCursor.getLong(albumCursor.getColumnIndex(AlbumsColumns._ID));
    // Other init stuff

    loaderManager.initLoader(UNIQUE_LOADER_ID, null, this);
}

@Override
public Loader<Cursor> onCreateLoader(int id, Bundle args) {

    // Here is the async query part.

    return new CursorLoader(context, PhotosColumns.CONTENT_URI, null, PhotosColumns.ALBUM_ID + " = ?", new String[]{Long.toString(albumId)}, null);
}

}
person X.Y.    schedule 15.01.2014