Я хочу создать галерею, которая отображает очень большое количество изображений. Для этого я создал класс адаптера с ImageView [3] и заставил getView раздать ImageView [position% 3]. Я также настраиваю адаптер для заполнения ImageView большими растровыми изображениями, которые загружаются асинхронно.
Поскольку бросок может прокручиваться быстрее, чем устройство может загружать изображения, у меня также есть гораздо более длинный набор миниатюр (который я также в конечном итоге буду использовать для галереи миниатюр). Если большое растровое изображение недоступно, ImageView заполняется миниатюрой, а затем снова загружается большим растровым изображением после его загрузки.
Поэтому моя проблема удручающе тривиальна: ImageView не масштабируется так, как я хочу. Желательно, чтобы ImageView был такой же высоты, как и его родитель, но с тем же соотношением сторон, что и его содержимое. Однако, если я заполню ImageView [], используя этот код:
private void initializeStaticArrays() {
//initialize envelope arrays
for(int i=0; i<ENVELOPE_ARRAY_SIZE; ++i)
{
mEnvelopeViews[i] = new ImageView(mContext);
//make the views as wide as their content and as tall as their parent
mEnvelopeViews[i].setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.MATCH_PARENT));
//then make them scale the contained image
mEnvelopeViews[i].setScaleType(ImageView.ScaleType.FIT_CENTER);
mEnvelopeIds[i] = Gallery.INVALID_POSITION;
mBundles[i] = new BitmapFilePathBundle();
}
for(int i=0; i<THUMBNAIL_ARRAY_SIZE; ++i)
{
mThumbnailViews[i] = new ImageView(mContext);
if(mThumbnailParams!=null) mThumbnailViews[i].setLayoutParams(new Gallery.LayoutParams(mThumbnailParams));
mThumbnailViews[i].setScaleType(ImageView.ScaleType.FIT_CENTER);
mThumbnailIds[i] = Gallery.INVALID_POSITION;
}
}
как только Gallery вызывает getView (), она падает (обратите внимание, что я вызвал setImageBitmap в другом месте кода, и это определенно произошло до вызова getView ()). Я бы предположил, что это арифметический цикл, что-то вроде попытки растянуть растровое изображение, чтобы оно соответствовало представлению, которое пытается содержать растровое изображение, но я не могу понять, какая комбинация параметров макета даст желаемый результат.
Итак: есть ли способ сделать ImageView таким же высоким, как его родитель, с масштабированием его содержимого, чтобы соответствовать ему с правильным соотношением сторон, и с шириной ImageView, точно совпадающей с шириной содержимого?
Редактировать: сбой был вызван CastException из LayoutParams в Gallery.LayoutParams. Изменение соответствующей строки на это:
//make the views as wide as their content and as tall as their parent
mEnvelopeViews[i].setLayoutParams(new Gallery.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.MATCH_PARENT));
исправляет сбой, но все еще не решает проблему масштабирования.