1、下面的代码主要是用于布局错乱后,自动修复,以及防止item左右交换的问题。在我遇到的问题当中,如果只setGapStrategy,会导致列表往回滑动时,顶部出现空白的问题。所以需要开启系统自动计算。

StaggeredGridLayoutManager layoutManager =new StaggeredGridLayoutManager(SPAN_COUNT, StaggeredGridLayoutManager.VERTICAL);// 开启系统自动计算,列表机制默认开启状态。layoutManager.setAutoMeasureEnabled(true);// 防止item交换位置layoutManager.setGapStrategy(StaggeredGridLayoutManager.GAP_HANDLING_NONE);

2、使用了以上的代码仍然无法解决布局闪动和错乱的问题,那是因为每个item高度不一样,如果现在你看到第100个item了,在列表中间插入数据,如果使用adapter…notifyDataSetChanged()进行全局刷新的话,就会导致布局以当前的posion开始重绘加载。所以你往回滑的时候是不断的逐步往上绘制的,这就导致了绘制到position==0的时候,顶部会有剩余空间。造成的原因就是我们执行插入数据或者是添加数据时,执行了全局刷新操作导致的。所以插入数据请使用adapter.notifyItemRangeInserted(startPosition, count);和adapter…notifyItemInserted(position);代替,即可解决。

3、为瀑布流增加分隔线问题,大家都知道是在getItemOffsets方法里面完成的操作。但是问题却出在这里,因为我遇到的瀑布流是那种不规则的瀑布流。

假如展示的是两竖列的瀑布流,列表里的索引号是:0、1、2、3、4、5、6、7、8、9
先来说说什么是规则的瀑布流:就是每个item大小高度一样,布局就是左边0,右边1,左边2,右边3,左边4,右边5,左边6,右边7,左边8,右边9,就是这样依次排列的,所以我称之为规则的瀑布流。而大部分的贴子都是在里getItemOffsets获取position然后取模计算item是处在左边,还是右边,针对位置不同然后分别设置左边距和右边距。

恰恰我遇到的就是每个item的高度是不一样的,这就导致item的排列索引并不标准,完全无法通过取模的方式来判断item所处的位置,然后再针对位置设置边距。唯一的办法就是,左、右、中间的空间设置成一样的,以解决此问题。否则按照取模的方式,布局就不整齐。那么有人肯定会问,我做的UI左右边距都是15dp,而中间是10dp,那要怎么搞呢?最简单的方法,我的建议是,从产品的角度解决,用你的魅力让产品折服,让左、中、右间距相同_

package oliver.zhantao.oliverframe.decoration;import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Rect;
import android.util.TypedValue;
import android.view.View;import androidx.recyclerview.widget.RecyclerView;/*** Created by Oliver on 2020/12/30.*/public class StaggeredDividerItemDecoration extends RecyclerView.ItemDecoration {private int mDividerWidth;private int mDividerBottom;/*** 上下文* @param context*/public StaggeredDividerItemDecoration(Context context) {mDividerWidth =(int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 7, context.getResources().getDisplayMetrics());mDividerBottom =(int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 30, context.getResources().getDisplayMetrics());}@Overridepublic void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {// item左右两边的间隔outRect.left = mDividerWidth;outRect.right = mDividerWidth;// item下方的间隔outRect.bottom = mDividerBottom;}@Overridepublic void onDraw(Canvas c, RecyclerView parent, RecyclerView.State state) {super.onDraw(c, parent, state);}
}

作者:沧水巫云
博客:http://blog.csdn.NET/amir_zt/
以上原创,转载请注明出处,谢谢。
https://blog.csdn.net/amir_zt/article/details/111951147

RecyclerView StaggeredGridLayoutManager瀑布流实现中遇到的问题相关推荐

  1. 【RecyclerView】 五、RecyclerView 布局 ( 瀑布流 | 交错网格局管理器 StaggeredGridLayoutManager )

    文章目录 一.交错网格局管理器 StaggeredGridLayoutManager ( 瀑布流 ) 二.交错网格局管理器默认设置 三.交错网格局管理器水平方向设置 四.完整代码示例 五.Recycl ...

  2. RecyclerView实现瀑布流,图片自适应高度

    话不多说,先上效果图 对于RecyclerView,相信大家都不陌生了,这个集listView,GridView,瀑布流效果与一身强大控件,渐渐地渗透在每个App.... 还是回到正题,如何让Recy ...

  3. SwipeRefreshLayout+CardView+RecyclerView 精美瀑布流效果

    博主声明: 转载请在开头附加本文链接及作者信息,并标记为转载.本文由博主 威威喵 原创,请多支持与指教. 本文首发于此   博主:威威喵  |  博客主页:https://blog.csdn.net/ ...

  4. android 水平方向瀑布流,Android RecyclerView(瀑布流)水平/垂直方向分割线

     Android RecyclerView(瀑布流)水平/垂直方向分割线 Android RecyclerView不像过去的ListView那样随意的设置水平方向的分割线,如果要实现Recycle ...

  5. 友盟登陆传值+OkHttp+recyclerview展示瀑布流+跳转Intent传值+属性动画

    友盟详情见 https://blog.csdn.net/aijaijgnaw/article/details/84203936 分包 友盟第三方登录 MyApp(Application) packag ...

  6. 使用RecyclerView实现瀑布流

    准备工作 添加网络权限,在此项目中用于获取网络图片 添加Glide依赖,用于加载图片 启用dataBinding,也可不用dataBinding,这里主要是练习一下 implementation 'c ...

  7. 使用RecyclerView实现瀑布流,仿照小红书,解决顶部留白、卡顿等问题

    一.最终效果: 二.工程结构框架: 三.核心实现: (1).实现RecyclerView控件的适配器类 主要就是实现下面三个函数的重载: @NonNull@Overridepublic Recycle ...

  8. Android RecyclerView 实现瀑布流

    Android RecyclerView 使用大全 - 基础使用,item 动画,下拉刷新等 瀑布流也是个常用的显示控件了,但是在使用时经常遇到一些问题,比如滑动回顶部后出现空隙.item在滑动时乱跳 ...

  9. Android RecyclerView实现瀑布流,图片自适应高度,不闪烁,解决位置交换

    记录一下以前自己代码中用到过代码效果,也做个备份,省的以后代码找不到,大家也可以参考参考,也许看过网上某些笔记,但是不记得了链接了,有问题可以联系本人 以下会写从布局到java代码以及用到的工具类都写 ...

最新文章

  1. JavaWeb:JSP
  2. 用神经网络分类原子和圆
  3. 接口测试用例设计思路
  4. 巨头入局,华为云将给音视频行业带来什么?
  5. 三杯茶(一本令全世界为之动容的书)(Three cups of tea)
  6. 现代数字图像处理作业----对lena.bmp图像采用高频强调滤波增强方法,并分析方法的效果。(理想、巴特沃斯、高斯) 其结果好不好?能否有改善的方法?
  7. 常用的推挽输出、开漏输出、上拉输入
  8. uniapp nvue页面 关闭输入法
  9. 基于AForge的C#摄像头视频录制
  10. 疑似网易泄露用户密码事件浅析
  11. 跟着老猫来搞GO-内建容器slice
  12. python 代理ip群发邮件1000人_python 群发邮件数量限制_qq邮箱群发邮件的数量和速度限制是多少?...
  13. 30万条弹幕大军都推荐你去看的《山海情》,是怎样一部最搞笑最土味的扶贫剧
  14. switch语句及三种循环语句
  15. 你们公司要求你写过如软著和专利吗?
  16. Justice 结构体记录排序前下标
  17. RTE2021开幕 声网重磅发布RTE万象图谱
  18. 软件 测试员必会英语单词,软件测试人员必备的英语单词(一)
  19. python读写大文件excel_python 读写 Excel文件
  20. 12306查询测试:https://www.12306.cn/index/

热门文章

  1. qlv如何转换为mp4格式?怎样将qlv转换成mp4格式?
  2. typeid的使用方法
  3. 从此以后提及你 无关风雨无关晴
  4. 技术转管理难,难在这9个“坑”!
  5. 做web前端开发就是爽!不仅工资高而且没事还能写个游戏玩!真棒
  6. mt7621dtsi
  7. 加密硬件货币钱包-市场现状及未来发展趋势
  8. 使用CuteFtp软件访问虚拟机下的Ubuntu
  9. MAC远程桌面控制Ubuntu
  10. greendao出现Failed to change locale for db ‘/data/data/xxx/databases/xxx.db‘ to ‘zh_CN‘.