StaggeredGridLayoutManager瀑布流错乱和顶部空白问题解决

遇到这个问题,去网上搜索的答案一般是:

staggeredGridLayoutManager.setGapStrategy(StaggeredGridLayoutManager.GAP_HANDLING_NONE);
然后在onScrollStateChanged方法里:

staggeredGridLayoutManager.invalidateSpanAssignments();
但是,这样做之后还是会有item错乱的问题,这种做法是在滑动停止的时候重新requestLayout一下而已,invalidateSpanAssignments()源码如下:

/**
 * For consistency, StaggeredGridLayoutManager keeps a mapping between spans and items.
 * 

* If you need to cancel current assignments, you can call this method which will clear all * assignments and request a new layout. */ public void invalidateSpanAssignments() { mLazySpanLookup.clear(); requestLayout(); }

可以看出,此方法并不能从根本上解决错乱的问题,要解决此问题,还需从原因下手。

为什么会出现空白和错乱现象?

空白和错乱本质上是同一个原因造成的。是因为recyclerview的复用机制遇上图片异步加载造成的,当瀑布流需要加载的图片的高度不一致时,假设第一个离开屏幕后的item的图片高度是100,被回收,而下一个要进入屏幕的item的图片高度是80,当图片还没加载完,下个item复用了第一个离开屏幕的item,产生了20的高度差,所以会出现错乱的现象,表现为图片展示区域与图片不匹配,要避免错乱,需要从item的高度控制入手

解决方案:

在onBind方法中,必须在图片加载方法之前设置图片高度:

ViewGroup.LayoutParams imageLayoutParams = imageViewHolder.image.getLayoutParams();
imageLayoutParams.width = CommonUtil.getDMWidthPixels(mContext) / 2;//获取实际展示的图片宽度
imageLayoutParams.height = (int) (imageLayoutParams.width * density);//获取最终图片高度
imageViewHolder.image.setLayoutParams(imageLayoutParams);//应用高度到布局中
这样,在每次onbind方法刚开始执行,图片没加载出来之前,先给图片预留出来一定的高度,使每个item的高度固定,就不会再出现item错乱的问题



你可能感兴趣的:(Android)