Android - 瀑布流布局中的错误项排列

4
我有一个关于Recycler视图和StaggeredGrid的问题,它把宽度削减了一半。 我使用Picasso将图像加载到项中,当我第一次加载图像时,它们在回收站中被奇怪地处理。 重新加载后,一切都看起来很好。
我认为问题来自于图像加载:StaggeredGrid第一次不知道图像高度,但由于缓存,重新加载后就知道了。
我该如何解决这个问题?

enter image description here


1
可能是重复的问题:Android RecyclerView 瀑布流滚动到顶部时项位置改变 - David Medenjak
3个回答

1
我认为你已经回答了自己的问题。在将数据添加到回收站之前,您需要加载图像/确定其尺寸。

我已经考虑过这样做了,尝试后,发现很奇怪:当我尝试用图像高度设置imageview的高度时,结果很糟糕。我不理解imageviews的调整大小系统。 - Okn
这是一个有些不同的问题。您可以通过使用预定的图像尺寸来解决它,通过将图像尺寸随初始数据传递,等待稍后加载图像,然后确定视图边界之前添加布局等方式来解决。最好尝试预先调整图像大小并就具体卡住了哪个步骤提出新问题。 - ian.shaun.thomas

0

这是因为当您向上或向下滚动时,容器无法识别图像视图的宽度和高度。它会在向下滚动时清除上方的视图,反之亦然。

请按以下方式使用:

@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


0

通过将间隔策略更改为:

已解决。
StaggeredGridLayoutManager manager = new StaggeredGridLayoutManager(2, StaggeredGridLayoutManager.VERTICAL);
    manager.setGapStrategy(StaggeredGridLayoutManager.GAP_HANDLING_MOVE_ITEMS_BETWEEN_SPANS);
    recyclerView.setLayoutManager(manager);

自动更改项目的位置


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接