首先:现象:recyclerview+glide+瀑布流
问题: 快速滑动出现,item错乱,图片闪烁,
查了各种资料,找了各中原因,太难找了,关键问题就是,你从服务器获取图片的时候,当前的viewholder,不知道,你图片有多大,造成,复用的时候,错乱,
- 解决方案: 给你的item布局中固定宽高,让你的布局
<ImageView
android:id="@+id/item_beagirs_ig"
android:layout_width="48dp"
android:layout_height="100dp"
android:adjustViewBounds="true"
android:background="#ff3c3c3c"
android:scaleType="centerCrop" />
当然如果这样的话,你用瀑布流就没什么意义了,也展现不出来,真正的效果,要想展现瀑布流效果,首先获取图片的比例,其次,再根据比例,设置宽高,这样我试过了,就显示不出来图片了,也不知道是不是我的方法不对,于是我采用了简单的方式,如下,其中imagHeightMap是一个hashMap类型的集合,记录每次的宽高,用于下次,复用时候的直接提取,
if (!imageHeightMap.containsKey(postion)) {
View view = holder.getView(R.id.item_beagirs_ig);
ViewGroup.LayoutParams params = view.getLayoutParams();
//设置图片的相对于屏幕的宽高比
params.width = (int) (TDevice.getScreenWidth() / 2);
params.height = (int) (TDevice.getScreenHeight() / 2 + Math.random() * 100);
view.setLayoutParams(params);
imageHeightMap.put(postion, params.height);
} else {
Integer integer = imageHeightMap.get(postion);
View view = holder.getView(R.id.item_beagirs_ig);
ViewGroup.LayoutParams params = view.getLayoutParams();
params.width = (int) (TDevice.getScreenWidth() / 2);
params.height = integer;
view.setLayoutParams(params);
}
这样错乱问题,基本解决,要是你再写上glide的占位图,估计更不会乱了,方正我是写了,很规整,除此之外,如果你的瀑布流,要是最顶端会留空白的话,你就用对使用如下,
@Override
public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
((StaggeredGridLayoutManager) layoutManager).invalidateSpanAssignments();//让头部重新布局,刷新
super.onScrollStateChanged(recyclerView, newState);
}
哈哈,就这样就解决了,大毛:走了,别啊,还有闪烁问题没解决呢,闪烁,还有什么闪烁问题,开个玩笑,
- 闪烁问题的解决:
每次向上滑动,当加载图片的时候,总是,闪烁一下,很明显,你刷新的太多了,当你下拉加载更多的时候,得到数据,不要用 adapter.notifyDataSetChanged();而是用notifyItemChanged(mdatas.size());//里面的数根据你的,去设置。
到此就基本解决,问题所在。