最近在做一个瀑布流的需求,类似qq看点,左右两列,但是每个item的高度根据图片不一样高,形成高低错落的感觉。作为码农,一开始直接搜瀑布流相关的demo,拿来直接用,可能是太简单了,并没有多少框架什么的,实际上确实比较简单,只是对新手来说,可能有几个注意点,我把自己遇到的记录下。
先直接找到一个老兄总结的,拿来直接用,没有太大问题 https://blog.csdn.net/xyzso1z/article/details/105258786
但是每次从下面的列表滑到顶部的时候,顶部会自动排列一下,原因是滑动到顶部的时候重新布局,绘制了,屏蔽后正常了,实际上错位是因为每个item布局高度不一样,滑动过去会动态计算导致错位,并且notifyDataSetChanged后也会闪一下,如果每个item的数据里,传递了高度宽度的信息,错位闪动留白的问题就解决了,
这个时候,可能有的notifyDataSetChanged后,每个item图片还是会闪,一般是因为框架刷新了图片,比如使用Glide加载图片不是从缓存取,而是从硬盘取,设置从缓存即可,或者使用settag,settag后,滑过去曾经有数据的就直接读取,没有的才会设置新的,不过这样会造成一个问题,数据刷新后显示的还是旧数据,这个时候增加数据新旧的比对即可,
比如有一个需求:瀑布流头部是一个横向的列表,用到RecyclerView嵌套,第一个数据是一个横向的RecyclerView,每次刷新数据,第一行的横向RecyclerView就自动复位到第一个数据的位置,这个时候设置tag,不会频繁初始化嵌套里的adapter,但是数据不刷新了,所以增加一个判断数据刷新的方法即可
这样瀑布流的坑基本就踩完了,和普通的的RecyclerView并没有什么差异,只是设置的setLayoutManager不同,闪动的问题基本是RecyclerView没处理好都会遇到的,
另一个问题是瀑布流两列的缝隙宽度要设置:上面老兄的方法是居中处理,比如左右两边的间距是10dp,中间的部分叠加后就是20了,可以通过addItemDecoration解决,
recyclerView.addItemDecoration(new SpaceItemDecoration(getContext(),2));