RecyclerView 实现瀑布流,关键是用StaggeredGridLayoutManager这个类。原以为很简单,用了之后才发现有很多的问题。
item乱跳
滑动时有空白出现
如果item高度不固定得时候,item内容不变的时候,可能出现同一个item高度可能会出现不同的值
1. item乱跳问题
StaggeredGridLayoutManager设置空隙处理方式为 不处理。
setGapStrategy(StaggeredGridLayoutManager.GAP_HANDLING_NONE)
2.滑动空白的问题
设置了StaggeredGridLayoutManager不处理空白之后,发现反复滑动列表时,顶部item上边会出现空白。网络很多都是讲 监听onScrollListener,然后调用
invalidateSpanAssignments();
这个方法会重绘视图,在scroll中调用会显得非常频繁,然后引起界面卡顿,滑动不流畅等问题。
本人优化了一下,在OnScrollStateChange方法中,但列表处于SCROLL_STATE_IDLE的时候才去调用这个方法,感觉卡顿方面好很多,但是偶尔还是会出现顶部空白的现象。所以这个不能从根本上解决问题,充其量算是一种弥补之法。
其实产生这个问题的根本原因在于Item的高度,尤其是高度设置为 wrap_content这种不固定的状态。
有很多人包括网上都说用map保存item的高度,尤其是当图片瀑布流不知道图片大小的时候,第一次保存起来,后面就直接从map里取值然后设置对应控件的高度。本人尝试之后,发现表面上看起来好像能解决问题&