Android - неправильное расположение элементов StaggeredGrid

У меня проблема с моим представлением Recycler и StaggeredGrid, которые сокращают ширину на 2. Я загружаю изображения в элементы с помощью Picasso, и когда я загружаю изображение в первый раз, они странно расположены в представлении recycler. После перезагрузки вроде все хорошо.

Я думаю, что проблема связана с загрузкой изображения: StaggeredGrid не знает высоту изображения в первый раз, но знает после перезагрузки из-за кеша.

Как я могу решить эту проблему ?

введите здесь описание изображения


person Okn    schedule 09.01.2016    source источник


Ответы (3)


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

person ian.shaun.thomas    schedule 09.01.2016
comment
Я уже думал это сделать, после попытки это уже странно: когда я пытаюсь установить высоту изображения с высотой изображения, результат плохой. Я не понимаю систему изменения размера изображений - person Okn; 09.01.2016
comment
Это немного другой вопрос. Вы можете решить эту проблему, используя предварительно определенные размеры изображения, передавая размеры изображения с вашими исходными данными, ожидая, пока вы не сможете позже загрузить изображение, а затем определить, какими будут границы представления, прежде чем добавлять макет и т. д. Вы были бы мудры чтобы реализовать попытку предварительно изменить размер изображений и задать новый вопрос о том, где именно вы застряли. - person ian.shaun.thomas; 09.01.2016

Решено путем изменения стратегии гэпа на:

StaggeredGridLayoutManager manager = new StaggeredGridLayoutManager(2, StaggeredGridLayoutManager.VERTICAL);
    manager.setGapStrategy(StaggeredGridLayoutManager.GAP_HANDLING_MOVE_ITEMS_BETWEEN_SPANS);
    recyclerView.setLayoutManager(manager);

Автоматическое изменение положения элементов

person Okn    schedule 09.01.2016

Это происходит потому, что держатель не распознает ширину и высоту изображения при прокрутке вверх и вниз. Он очищает верхний вид при прокрутке вниз и наоборот.

Используйте так:

@Override
public void onBindViewHolder(ViewHolder viewHolder, int position) {

MyViewHolder vh = (MyViewHolder) viewHolder;
ImageModel item = imageModels.get(position);
RelativeLayout.LayoutParams rlp = (RelativeLayout.LayoutParams)vh.imageView.getLayoutParams();
float ratio = item.getHeight() / item.getWidth();
rlp.height = (int) (rlp.width * ratio);
vh.imageView.setLayoutParams(rlp);
vh.positionTextView.setText("pos: " + position);
vh.imageView.setRatio(item.getRatio());
Picasso.with(mContext).load(item.getUrl()).placeholder(PlaceHolderDrawableHelper.getBackgroundDrawable(position)).into(vh.imageView);
}

Для очистки см. эту ссылку: Picasso/Glide-RecyclerView-StaggeredGridLayoutManager

person YLS    schedule 21.04.2016