使用StaggeredGridLayoutManager实现交错式网格布局

StaggeredGridLayoutManager瀑布流错乱和顶部空白问题解决 遇到这个问题,去网上搜索的答案一般是: staggeredGridLayoutManager.setGapStrategy(StaggeredGridLayoutManager.GAP_HANDLING_NONE); 然后在onScrollStateChanged方法里: staggeredGridLayoutManager.invalidateSpanAssignments() 阅读详情

一直在想着怎么描述这样的布局,毕竟用的是瀑布流的布局管理器,但是呢效果基本就是个网格布局,只是每列之间是上下错开的,还是觉得叫交错式网格布局吧。先看个效果。
这里写图片描述
效果看起来应该很好实现的。这里仅仅是记录下自己实现的思路,然后贴出一些重要的代码。
基本思路就是运用StaggeredGridLayoutManager管理器来实现这种布局,在Recyclerview适配器中的onBindViewHolder中设置,将第一行和第三行上的首张图片设置一个margin值,距离顶部一个距离,这样既可实现该种布局。
其实还有一种思路也是运用瀑布流管理器,在自定义分割线中,根据position不同设置不同间隔距离,应该是可以的。
这里就用第一个思路,首先是Recyclerview的用法,这个相信大家都很熟悉了,管理器官方的有三种,线性管理器LinearLayoutManager,网格管理器GridLayoutManager,瀑布流管理器StaggeredGridLayoutManager,这里用的是瀑布流管理器:

mRecyclerView = (RecyclerView) findViewById(R.id.recyclerview);
        final StaggeredGridLayoutManager layoutManager = new StaggeredGridLayoutManager(3,StaggeredGridLayoutManager.VERTICAL);//定义瀑布流管理器,第一个参数是列数,第二个是方向。
        layoutManager.setGapStrategy(StaggeredGridLayoutManager.GAP_HANDLING_NONE);//不设置的话,图片闪烁错位,有可能有整列错位的情况。
        mRecyclerView.setLayoutManager(layoutManager);//设置瀑布流管理器
        mRecyclerView.addItemDecoration(new GridSpacingItemDecoration(40));//边距和分割线,需要自己定义
        mRecyclerView.setAdapter(new MyAdapter(this));//设置适配器
        mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
            @Override
            public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
                super.onScrollStateChanged(recyclerView, newState);
                layoutManager.invalidateSpanAssignments();//这行主要解决了当加载更多数据时,底部需要重绘,否则布局可能衔接不上。
            }
        });

上面的代码就是Recyclerview的使用了。接下来看适配器中的代码。

 class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder> {
         private Context context;
         private LayoutInflater inflater;
         public MyAdapter(Context context){
             this.context = context;
             inflater = LayoutInflater.from(context);
         }
        public final String[] imageUrls = new String[] {。。。}//这里是从网上加载的图片的链接组成的字符串数组。我这里是从《第一行代码》作者郭霖大神的http://blog.youkuaiyun.com/guolin_blog/article/details/10470797讲述瀑布流的文章中偷过来的。哈哈。不过都是网上的图片地址。

        @Override
        public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
            View inflate = inflater.inflate(R.layout.item_main, parent, false);//单个item的布局
            return new MyViewHolder(inflate);
        }

        @Override
        public int getItemCount() {
            return imageUrls.length;
        }

        @Override
        public void onBindViewHolder(final MyViewHolder holder, int position) {
            holder.textView.setText("风景" + position);
            //用了Glide加载图片,这是一款不错的图片加载框架,毕竟属于Google亲儿子了吧,不会用的也可以用picasso,这个框架参考picasso的,基本跟picasso一模一样。
            Glide.with(context)
                    .load(imageUrls[position])
                    .asBitmap()
                    .centerCrop()
                    .diskCacheStrategy(DiskCacheStrategy.NONE)//这里设置了不做任何缓存
                    .placeholder(R.drawable.kobe)//这是占位图。加载图片的一瞬间可以用来填充,万一网络不行还可以有个好的视觉效果。毕竟什么都不显示让人很绝望呀。。。
                    .into(new BitmapImageViewTarget(holder.imageView){
                        @Override
                        protected void setResource(Bitmap resource) {
                            super.setResource(resource);
                            //这里用来进行图片转换,转成圆形的图。
                            RoundedBitmapDrawable circleBitmap = RoundedBitmapDrawableFactory.create(context.getResources(),resource);
                            circleBitmap.setCircular(true);
                            holder.imageView.setImageDrawable(circleBitmap);
                        }
                    });
                    //这里就是让我们最终的效果跟Gridview不同的原因了,我们把第一列和第三列的首张图片设置距离顶部一个距离,这样布局错落有致,就是我们要的效果了
            if (position == 0 || position ==2) {
                LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(holder.imageView.getLayoutParams());
                lp.setMargins(0,100,0,0);
                holder.imageView.setLayoutParams(lp);
            } else {
                LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(holder.imageView.getLayoutParams());
                lp.setMargins(0,0,0,0);
                holder.imageView.setLayoutParams(lp);
            }
        }

        class MyViewHolder extends RecyclerView.ViewHolder{
            private ImageView imageView;
            private TextView textView;
            public MyViewHolder(View itemView) {
                super(itemView);
                imageView = (ImageView) itemView.findViewById(R.id.iv);
                textView = (TextView) itemView.findViewById(R.id.tv);
            }
        }
    }

以上就可以得到文章开始的效果了。。。
大家有什么疑问或者有什么建议,欢迎留言交流。。

android瀑布流,完美解决滑动过程中item位置错乱,下拉刷新顶部空白,加载更多顶部错乱等问题 StaggerdRecyclerView android瀑布流,完美解决滑动过程中item位置错乱,下拉刷新顶部空白,加载更多顶部错乱等问题,还可以实现动画效果 效果图 集成 allprojects { repositories { ... maven { url 'https://jitpack.io' } } } dependencies { implementation 'com.github.moo611:StaggerdRecyclerView:latestversion' } 基本用法 1.布局文件里添加 2.您的model,需要实 立即下载

相关推荐

Xarray实战:从气象数据到可视化分析的完整流程(附Python代码)

本文详细介绍了使用Xarray库处理气象数据的完整实战流程。针对气象领域常见的NetCDF和GRIB格式,文章从数据读取、坐标操作、智能索引、统计计算到高级可视化,提供了完整的Python代码示例。重点阐述了Xarray如何高效处理高维标记数据,帮助地球科学领域的研究人员将繁琐的数据处理工作转化为高效的分析流水线。

d6e7f8g9h的博客 290

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

一、交错网格局管理器 StaggeredGridLayoutManager ( 瀑布流 )、 二、交错网格局管理器默认设置、 三、交错网格局管理器水平方向设置、 四、完整代码示例、 五、RecyclerView 相关资料

让 学习 成为一种 习惯 ( 韩曙亮 の 技术博客 ) 4515

Educoder | 计算机网络实验-Ping命令与ICMP协议分析

任务描述本关任务:捕获 Ping 程序生成的数据包。相关知识ping命令Ping 程序是一个简单的工具,允许任何人(例如:网络管理员)验证主机是否存在。源主机中的 Ping 程序将数据包发送到目标 IP 地址;如果目标是在线的,则目标主机中的 Ping 程序将会发送响应 Ping 数据包证明他在线,这两个 Ping 数据包都是 ICMP 数据包。在 Unix/Linux,序列号从 0 开始计数,依次递增。而 Windows 中 ping 程序的 ICMP 序列号是没有规律;;。

Mksg_28的博客 7626

Android中RecyclerView瀑布流网格布局管理器StaggeredGridLayoutManager用法

电商APP中我们时常用到一种流式布局,可以很好的灵活展示我们不同大小的图片和样式。我们的RecyclerView也具有这样的功能,就是借助StaggeredGridLayoutManager来实现流式布局。这里我们就简单介绍一下流式布局的做法。 1.流式布局StaggeredGridLayoutManager常用方法 构造函数:可指定网格的列数和方向。 setSpanCount:设置网格的列数。 setOrientation:设置瀑布流布局的方向,取值说明同LinearLayoutManager。

水月洞天 8893

什么是 WhatsApp云控 WhatsApp群发,WhatsApp协议,他们有什么区别?

下面我们sensws讲解下什么是WhatsApp云控 WhatsApp群发,WhatsApp协议

sendws的博客 3875

切比雪夫(最小区域法)直线拟合算法

切比雪夫,最小区域法直线拟合

闪电彬彬的博客 3962

Android控件RecyclerView(二)——LayoutManager及其自定义

目录 前言 1 常用LayoutManager 1.1 LinearLayoutManager 1.2 GridLayoutManager 1.3 StaggeredGridLayoutManager 1.4 FlexboxLayoutManager 2 自定义LayoutManager 2.1 创建自定义LayoutManager类 2.2 绘制RecyclerView子Vie...

xhuww的博客 2万+

51单片机学习(5)-----蜂鸣器的介绍与使用

蜂鸣器是一种一体化结构的电子讯响器,采用直流电压供电,广泛应用于计 算机、 打印机、 复印机、 报警器、 电子玩具、 汽车电子设备、 电话机、 定 时器等电子产品中作发声器件。蜂鸣器主要分为压电式蜂鸣器和电磁式蜂鸣器两种类型。1.半导体三极管也称为晶体三极管,可以说它是电子电路中最重要的器件。三极管顾名思义具有三个电极。二极管是由一个PN结构成的,而三极管由两个PN结构成,共用的一个电极成为三极管的基极(用字母b表示)。其他的两个电极成为集电极(用字母c表示)和发射极(用字母e表示)。

2302_80260350的博客 1万+

RecyclerView如何设置瀑布流

一直在想着怎么描述这样的布局,毕竟用的是瀑布流的布局管理器,但是呢效果基本就是个网格布局,只是每列之间是上下错开的,还是觉得叫交错式网格布局吧。先看个效果。 效果看起来应该很好实现的。这里仅仅是记录下自己实现的思路,然后贴出一些重要的代码。 基本思路就是运用StaggeredGridLayoutManager管理器来实现这种布局,在Recyclerview适配器中的onBind

qq_40072139的博客 826

YOLOv11改进策略【Neck】| ASF-YOLO 注意力尺度序列融合模块改进颈部网络,提高小目标检测精度

ASF-YOLO是一种基于YOLO的新颖框架,结合了空间和尺度特征以实现准确和快速的分割。其中,注意力尺度序列融合模块。

Limiiiing的博客 4391

Open3D(C++) 读取、可视化并保存点云【2025最新版】

博客长期更新,本文最近更新时间为:2025年1月6日。

点云侠的博客 4617

[Android学习笔记三] Support v7提供交错式网格布局开发示例

      本文主要介绍Android Support v7提供的RecycleView和交错式布局(通常成为瀑布流布局)的使用和事件监听处理。  1. 涉及到开源库有:   Fresco :    Facebook开源的不是一般强大的图片加载组件库    Bufferknife :    Android View和事件绑定库,通过注解完成,在编译时APT处理注解文档。    2. 模块配置   ...

weixin_34194702的博客 131

WebRTC之beamforming算法

CSND已永久停更,最新版唯一来源点击下面链接跳转: 语音增强和语音识别网页书 坐标问题 这里以笔记本为例进行说明,当笔记本按如下方式打开: 首先是键盘和液晶屏呈90度,然后鼠标上方,也就是液晶屏上方正中间是camera,把平行于键盘的面看成是xy平面,把液晶屏所在的面看成是xz平面,所有平面的原点都在Camera的位置。 方位角:从原点开始,Camera的右侧是0度,逆时针方...

shichaog的专栏 1万+

Android RecyclerView的StaggeredGridLayoutManager和CardView

 《Android RecyclerView的StaggeredGridLayoutManager和CardView》 StaggeredGridLayoutManager,顾名思义,”交错排列的Grid”,在RecyclerView中可以将元素分列编排下去。 我在之前的文章...

chuoshao2508的博客 161

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

RecyclerView实现瀑布流

我们在使用RecyclerView时,更多的是通过网络请求得到数据,比如在加载图片或者列表项时,我们往往需要判断当前屏幕上显示的第一个item的postion是多少,最后一个item的postion是多少,当前屏幕共显示了几个item项,如果使用ListView或者GridView来判断当然好判断,只要实现AbsListView.OnScrollListener这个接口就可以得到,那么在Recyc

u013378580的博客 504

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

android 区域交错,如何确定交错网格布局管理器中的列位置

Tooroop..35我设法让它运作起来.所以在我的情况下,我不需要在屏幕的左右边缘有任何边框.我只需要中间和底部的边框.解决方案是获取StaggeredGridLayoutManager.LayoutParams类型的视图的布局参数.在这些参数中,您可以获取spanIndex,它告诉您视图的索引.因此,如果spanCount为2,则左视图的spanIndex为0,右视图的spanIndex为1....

weixin_39595487的博客 213

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

从头开始学 RecyclerView(六) LayoutManager

前言在前面的文章中,每个示例,都使用了LayoutManager,毕竟它是RecyclerView不可缺少的一部分。LayoutManager,顾名思义,就是『布局管理器』。使用如下代码,设置RecyclerView的LayoutManager:mRecyclerView.setLayoutManager(layoutManager);已提供的LayoutManagerandroid.support

打渔还是晒网 —— stone 3166

android中RecyclerView的简单使用(一)

针对Android程序员,我这边给大家整理了一些资料,包括不限于高级UI、性能优化、架构师课程、NDK、混合式开发(ReactNative+Weex)微信小程序、Flutter等全方面的Android进阶实践技术;希望能帮助到大家,也节省大家在网上搜索资料的时间来学习,也可以分享动态给身边好友一起学习!往期Android高级架构资料、源码、笔记、视频。高级UI、性能优化、架构师课程、混合式开发(ReactNative+Weex)全方面的Android进阶实践技术,群内还有技术大牛一起讨论交流解决问题。

2401_84121485的博客 1013

RecyclerView的三种LayoutManager

主要有三种 1)线性布局(LinearLayoutManager) 2)网格布局(GridLayoutManager) 3)交错布局(StaggeredGridLayoutManager)

Just Do it 2031

Android开发之RecyclerView实现流式布局

RecyclerView是什么?RecycleView的出现, 替代了ListView, 没了OnitemClickListener,; LayoutManager负责计算布局; Adapter 负责适配,还增加了ViewHolder;RecycleView只负责调度, 让每个Item去干他们想做的事情. 这让事情看起来很有条例.RecyclerView能做什么?我们知道RecyclerView中...

丿灬安之若死 4515
上一篇: 用Glide加载图片到Recyclerview中有时候只显示占位图的问题
下一篇: Android Studio Gradle配置详解
chendroid
博客等级 码龄12年 9粉丝 17原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值