当前位置: 首页 > news >正文

Android 实现双列图片瀑布流式布局

Android 实现双列图片瀑布流式布局

实现双列图片瀑布流布局,关键在于 RecyclerViewStaggeredGridLayoutManager 和图片的动态加载。以下是实现步骤:


1. 添加必要依赖

使用 Glide 加载图片。确保在 build.gradle 中添加依赖:

implementation 'com.github.bumptech.glide:glide:4.15.1'
annotationProcessor 'com.github.bumptech.glide:compiler:4.15.1'

2. 布局文件

主布局文件(activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".MainActivity"><androidx.recyclerview.widget.RecyclerViewandroid:id="@+id/recyclerView"android:layout_width="match_parent"android:layout_height="match_parent"android:scrollbars="vertical" /></androidx.constraintlayout.widget.ConstraintLayout>
子项布局文件(item_staggered_image.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="vertical"android:padding="4dp"><ImageViewandroid:id="@+id/image_view"android:layout_width="match_parent"android:layout_height="wrap_content"android:scaleType="centerCrop" /></LinearLayout>

3. RecyclerView 配置

package com.check.waterfallimport androidx.appcompat.app.AppCompatActivity
import android.os.Bundleimport androidx.recyclerview.widget.RecyclerView
import androidx.recyclerview.widget.StaggeredGridLayoutManagerclass MainActivity : AppCompatActivity() {override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.activity_main)val recyclerView = findViewById<RecyclerView>(R.id.recyclerView)// 设置 StaggeredGridLayoutManager 为双列recyclerView.layoutManager = StaggeredGridLayoutManager(2, StaggeredGridLayoutManager.VERTICAL)// 模拟图片数据val imageUrls = listOf("https://via.placeholder.com/300x200","https://via.placeholder.com/300x300","https://via.placeholder.com/300x400","https://via.placeholder.com/300x500","https://via.placeholder.com/300x600","https://via.placeholder.com/300x700","https://via.placeholder.com/300x800","https://via.placeholder.com/300x900","https://via.placeholder.com/300x1000","https://via.placeholder.com/300x1100","https://via.placeholder.com/300x1200","https://via.placeholder.com/300x1300","https://via.placeholder.com/300x1400","https://via.placeholder.com/400x300","https://via.placeholder.com/400x600","https://via.placeholder.com/400x900","https://via.placeholder.com/400x1200",)// 设置 AdapterrecyclerView.adapter = StaggeredImageAdapter(imageUrls)}
}

4. 创建 RecyclerView Adapter

package com.check.waterfallimport android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.ImageView
import androidx.recyclerview.widget.RecyclerView
import com.bumptech.glide.Glideclass StaggeredImageAdapter(private val imageUrls: List<String>) :RecyclerView.Adapter<StaggeredImageAdapter.ViewHolder>() {private val itemHeights = mutableMapOf<Int, Int>() // 缓存每个位置的高度class ViewHolder(view: View) : RecyclerView.ViewHolder(view) {val imageView: ImageView = view.findViewById(R.id.image_view)}override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {val view = LayoutInflater.from(parent.context).inflate(R.layout.item_staggered_image, parent, false)return ViewHolder(view)}override fun onBindViewHolder(holder: ViewHolder, position: Int) {// 动态设置高度,使用缓存高度val params = holder.imageView.layoutParamsif (!itemHeights.containsKey(position)) {itemHeights[position] = (400..800).random() // 仅随机生成一次高度}params.height = itemHeights[position] ?: 400holder.imageView.layoutParams = params// 使用 Glide 加载图片Glide.with(holder.itemView.context).load(imageUrls[position]).placeholder(android.R.drawable.progress_indeterminate_horizontal).error(android.R.drawable.stat_notify_error).into(holder.imageView)}override fun getItemCount(): Int = imageUrls.size
}

5. 添加网络权限

<uses-permission android:name="android.permission.INTERNET" />

6. 效果展示

运行上述代码后,RecyclerView 将展示双列的瀑布流布局,图片加载时的高度随机化。使用 Glide 还可以处理图片的缓存和加载失败的情况。

image-20241124233504538

相关文章:

Android 实现双列图片瀑布流式布局

Android 实现双列图片瀑布流式布局 实现双列图片瀑布流布局&#xff0c;关键在于 RecyclerView 的 StaggeredGridLayoutManager 和图片的动态加载。以下是实现步骤&#xff1a; 1. 添加必要依赖 使用 Glide 加载图片。确保在 build.gradle 中添加依赖&#xff1a; implement…...

运维Tips:Docker或K8s集群拉取Harbor私有容器镜像仓库配置指南

[ 知识是人生的灯塔,只有不断学习,才能照亮前行的道路 ] Docker与Kubernetes集群拉取Harbor私有容器镜像仓库配置 描述:在现在微服务、云原生的环境下,通常我们会在企业中部署Docker和Kubernetes集群,并且会在企业内部搭建Harbor私有镜像仓库以保证开发源码安全,以及加快…...

显示类控件

文章目录 1 QLabel1.1 常用属性1.2 例子1&#xff0c;设置文本 (textFormat)1.3 例子2&#xff0c;设置widget背景图片 (pixmap和scaledContents)1.4 例子3&#xff0c;设置对齐方式 (alignment)1.5 例子4&#xff0c;设置自动换行&#xff0c;缩进和边距1.5.1 设置换行 (wordW…...

AOC显示器915Sw按键失灵维修记

大家好&#xff0c;我是 程序员码递夫 今天给大家分享的是自己维修老古董AOC液晶显示器按键失灵的的过程&#xff0c;实属DIY记录。 1、引子 家里有台老古董的19寸AOC液晶显示器&#xff08;型号915Sw&#xff09;, 一直作为我的副显示器陪伴着左右&#xff0c;显示还正常&a…...

PyQt学习笔记

一.PyQt5的安装 当我们安装好开发环境后&#xff0c;打开pycharm在其设置里面点击按钮自动安装即可。 安装完成后我们会在这里面看到这几个东西说明安装成功了。 二.PyQt5 GUI程序框架 1.一个简单的PyQt5应用程序 首先我们用pycharm创建一个demo.py的文件。 我们创建文件为s…...

LLMops产品介绍

文章目录 字节跳动的扣子优点低代码开发丰富的插件与能力扩展强大的记忆与数据交互能力应用场景广泛 不足模型选择相对受限定制化程度受限输出效果有待提高应用部署范围有限市场认知度和用户基础不足 开悟大模型运营管理系统&#xff08;LLMOPS&#xff09;优点全生命周期管理降…...

【GPTs】Front-end Expert:助力前端开发的智能工具

博客主页&#xff1a; [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: AIGC | GPTs应用实例 文章目录 &#x1f4af;GPTs指令&#x1f4af;前言&#x1f4af; Front-end Expert主要功能适用场景优点缺点 &#x1f4af;小结 &#x1f4af;GPTs指令 中文翻译&#xff1a; 使用Dalle生成用户…...

一篇保姆式centos/ubuntu安装docker

前言&#xff1a; 本章节分别演示centos虚拟机&#xff0c;ubuntu虚拟机进行安装docker。 上一篇介绍&#xff1a;docker一键部署springboot项目 一&#xff1a;centos 1.卸载旧版本 yum remove docker docker-client docker-client-latest docker-common docker-latest doc…...

人工智能大趋势下软件开发的未来

随着人工智能&#xff08;AI&#xff09;技术的不断演进&#xff0c;软件开发领域正经历着深刻的变革。中国电信推出的星辰大模型软件工厂&#xff0c;作为国内首款破局性AI开发工具&#xff0c;其全自动流水线的特性——自动生成前后端代码、自主测试和纠错等&#xff0c;为软…...

string的模拟实现

string的模拟实现 一.string的模拟实现1.1构造函数和析构函数&#xff0c;以及一些简单函数1.2迭代器1.3增删查改 二.运算符重载三.流插入和流提取 一.string的模拟实现 string本质上是是一种char类型的顺序表&#xff0c;结构上和顺序表相似。 namespace Mystring {class st…...

Qt桌面应用开发 第七天(绘图事件 绘图设备)

目录 1.绘图事件paintEvent 2.高级绘图 3.图片绘制 4.绘图设备 4.1QPixmap 4.2QBitmap 4.3QImage 4.4QPicture 1.绘图事件paintEvent paintEvent——绘图事件 需求&#xff1a;利用QPainter绘制点、线、圆、矩形、文字&#xff1b;设置画笔改为红色&#xff0c;宽度为…...

PDF内容提取,MinerU使用

准备环境 # python 3.10 python3 -m pip install huggingface_hub python3 -m pip install modelscope python3 -m pip install -U magic-pdf[full] --extra-index-url https://wheels.myhloli.com下载需要的模型 import json import osimport requests from huggingface_hub…...

基于lora的llama2二次预训练

基于lora的llama2二次预训练 一、为什么需要对llama2做基于lora的二次预训练? 加入中文训练语料进行llama2的二次预训练&#xff0c;这样模型就可以增加支持中文输出的能力。 二、基于lora的llama2二次预训练的目标是什么&#xff1f; 在保持预训练模型权重不变的情况下&a…...

机器学习之量子机器学习(Quantum Machine Learning, QML)

量子机器学习(Quantum Machine Learning, QML)是一门结合量子计算与机器学习的新兴交叉领域。它利用量子计算的优势(如并行计算、量子叠加和量子纠缠)来解决传统机器学习中难以处理的问题,或提升算法效率和性能。 QML 的核心要素 量子计算的特性: 量子叠加:允许量子比特…...

【2024 Optimal Control 16-745】【Lecture 3 + Lecture4】minimization.ipynb功能分析

主要功能-最小化问题 目标函数分析: 定义函数 f ( x ) f(x) f(x) 及其一阶、二阶导数。使用绘图工具可视化函数的形状。 实现数值优化: 使用牛顿法寻找函数的极值点&#xff0c;结合一阶和二阶导数加速收敛。使用正则化牛顿法解决二阶导数矩阵可能不正定的问题。 可视化过程…...

一种新的电机冷却方式——热管冷却

在现代工业设备中&#xff0c;电机作为一种核心动力装置&#xff0c;广泛应用于各个领域。例如&#xff0c;家用电器、自动化生产线、交通工具等都离不开电机的运作。然而&#xff0c;随着电机功率的不断提升和负载的增加&#xff0c;电机在运行过程中产生的热量也随之增多&…...

虚拟机上搭建达梦DSC简略步骤

vmware 17 centos 7.6 达梦 dm8_20240920_x86_rh7_64.iso cd /d C:\Program Files (x86)\VMware\VMware Workstation\.\vmware-vdiskmanager.exe -c -s 100MB -a lsilogic -t 2 "F:\vm\dmdsc\sharedisk\share-dcr.vmdk" .\vmware-vdiskmanager.exe -c -s 100MB -a l…...

C++ 矩阵旋转

【问题描述】 编写一个程序&#xff0c;读入一个矩阵&#xff0c;输出该矩阵以第一行第一列数字为中心&#xff0c;顺时针旋转90度后的新矩阵&#xff0c;例如&#xff1a; 输入的矩阵为: 1 2 3 4 5 6 顺时针旋转90度后输出的矩阵为&#xff1a; 4 1 5 2 6 3 【输入…...

mongodb基础操作

创建数据库 use admin授权 db.auth("admin","123456")创建用户 db.createUser({ user: "xxx", pwd: "xxxxxx", roles: [ { role: "readWrite", db: "iot" } ] })查询数据库大小 show dbs;查询结果数量 db.mo…...

以思维链为线索推理隐含情感

❀ 以思维链为线索推理隐含情感 简介摘要引言THORTHOR核心代码实验结果代码运行总结 简介 本文主要对2023ACL论文《Reasoning Implicit Sentiment with Chain-of-Thought Prompting》主要内容进行介绍。 摘要 尽管情绪分析任务常依据文本中的直接意见表达来判定目标的情绪倾向…...

(笔记,自己可见_1)简单了解ZYNQ

1、zynq首先是一个片上操作系统&#xff08;Soc&#xff09;&#xff0c;结合了arm&#xff08;PS&#xff09;和fpga&#xff08;PL&#xff09;两部分组成 Zynq系统主要由两部分组成&#xff1a;PS&#xff08;Processing System&#xff09;和PL&#xff08;Programmable L…...

部署自动清理任务解决ORA-00257: archiver error. Connect internal only, until freed

使用oracle数据库的时候&#xff0c;我们一般都会开启归档&#xff0c;确保数据库的日志连续和和数据安全。但随着数据库的运行&#xff0c;归档文件会越来越多&#xff0c;最终撑满磁盘空间&#xff0c;数据库无法继续归档&#xff0c;出现“ORA-00257: archiver error. Conne…...

scau编译原理综合性实验

一、题目要求 题目&#xff1a; 选择部分C语言的语法成分&#xff0c;设计其词法分析程序、语法语义分析程序。 要求&#xff1a; 设计并实现一个一遍扫描的词法语法语义分析程序&#xff0c;将部分C语言的语法成分&#xff08;包含赋值语句、if语句、while循环语句&#xf…...

[Docker-显示所有容器IP] 显示docker-compose.yml中所有容器IP的方法

本文由Markdown语法编辑器编辑完成。 1. 需求背景: 最近在启动一个服务时&#xff0c;突然发现它的一个接口&#xff0c;被另一个服务ip频繁的请求。 按理说&#xff0c;之前设置的是&#xff0c;每隔1分钟请求一次接口。但从日志来看&#xff0c;则是1秒钟请求一次&#xff…...

PICO VR串流调试Unity程序

在平时写Unity的VR程序的时候&#xff0c;需要调试自己写的代码&#xff0c;但是有的时候会发现场景过于复杂&#xff0c;不是HMD一体机能运行的&#xff0c;或者为了能够更方便的调试&#xff0c;不需要每次都将程序部署到眼睛里&#xff0c;这样非常浪费时间&#xff0c;对于…...

ESP-KeyBoard:基于 ESP32-S3 的三模客制化机械键盘

概述 在这个充满挑战与机遇的数字化时代&#xff0c;键盘已经成为我们日常学习、工作、娱乐生活必不可少的设备。而在众多键盘中&#xff0c;机械键盘&#xff0c;以其独特的触感、清脆的敲击音和经久耐用的特性&#xff0c;已经成为众多游戏玩家和电子工程师的首选。本文将为…...

PML和金属边界区别

一、完美匹配层&#xff08;PML&#xff09;边界 原理&#xff1a;PML是一种特殊的吸收边界条件。它基于麦克斯韦方程组的特殊解来设计&#xff0c;其材料参数是经过精心选择的&#xff0c;使得在这个边界区域内&#xff0c;电磁波能够无反射地进入并被吸收。从数学上来说&…...

机器学习基础--基于线性回归房价预测

经典的线性回归模型主要用来预测一些存在着线性关系的数据集。回归模型可以理解为&#xff1a;存在一个点集&#xff0c;用一条曲线去拟合它分布的过程。如果拟合曲线是一条直线&#xff0c;则称为线性回归。如果是一条二次曲线&#xff0c;则被称为二次回归。线性回归是回归模…...

【Y20030007】基于java+servlet+mysql的垃圾分类网站的设计与实现(附源码 配置 文档)

网垃圾分类网站的设计与实现 1.摘要2.开发目的和意义3.系统功能设计4.系统界面截图5.源码获取 1.摘要 随着全球环境保护意识的提升&#xff0c;垃圾分类已成为一项紧迫且重要的任务。为了有效推动垃圾分类的实施&#xff0c;提升公众的环保意识和参与度&#xff0c;垃圾分类已…...

47小型项目的规划与实施

每天五分钟学Linux | 第四十七课&#xff1a;小型项目的规划与实施 大家好&#xff01;欢迎再次来到我们的“每天五分钟学Linux”系列教程。在前面的课程中&#xff0c;我们学习了并发编程的知识&#xff0c;包括如何管理和使用进程与线程。今天&#xff0c;我们将探讨如何规划…...

Linux---ps命令

​​​​​​Linux ps 命令 | 菜鸟教程 (runoob.com) process status 用于显示进程的状态 USER: 用户名&#xff0c;运行此进程的用户名。PID: 进程ID&#xff08;Process ID&#xff09;&#xff0c;每个进程的唯一标识号%CPU: 进程当前使用的CPU百分比%MEM: 进程当前使用的…...

Qt Qt::UniqueConnection 底层调用

在这里插入图片描述 步骤1&#xff1a; 1&#xff1a;判断槽函数连接方式&#xff0c; 以及信号对象是否有效2&#xff1a; 信号计算格式是否 大于 signal_index 目前调试 signal_index 不太清楚怎末计算的&#xff08;有清楚的帮忙街道&#xff09;3&#xff1a;获取槽函数对…...

Jenkins + gitee 自动触发项目拉取部署(Webhook配置)

目录 前言 Generic Webhook Trigger 插件 下载插件 ​编辑 配置WebHook 生成tocken 总结 前言 前文简单介绍了Jenkins环境搭建&#xff0c;本文主要来介绍一下如何使用 WebHook 触发自动拉取构建项目&#xff1b; Generic Webhook Trigger 插件 实现代码推送后&#xff0c;触…...

2025-2026财年美国CISA国际战略规划(下)

文章目录 前言四、加强综合网络防御&#xff08;一&#xff09;与合作伙伴共同实施网络防御&#xff0c;降低集体风险推动措施有效性衡量 &#xff08;二&#xff09;大规模推动标准和安全&#xff0c;以提高网络安全推动措施有效性衡量 &#xff08;三&#xff09;提高主要合作…...

aws ses生产环境申请

* aws ses生产环境申请经验&#xff1a; 要有域名邮箱作为反馈联系邮箱 且有收发记录 最好使用aws的WorkMail要说明清晰的使用用途、预估量、如何处理退信和投诉、防spam策略 等内容&#xff0c;这里可以先问问AI&#xff08;比如&#xff1a;如何处理退信和投诉&#xff1f;…...

velocity unable to find resource ‘xxx.vm‘ in any resource loader

大家好&#xff0c;我是 程序员码递夫。 [TOC]velocity unable to find resource ‘xxx.vm’ in any resource loader 1.问题 今天帮客户解决一个远古 java web系统的bug , 客户的系统用了非常古老的框架 jdk1.6struc1.1 velocity1.5 运行在tomcat6环境。 客户想迁移到 tomc…...

InfluxDB时序数据库笔记(一)

InfluxDB笔记一汇总 1、时间序列数据库概述2、时间序列数据库特点3、时间序列数据库应用场景4、InfluxDB数据生命周期5、InfluxDB历史数据需要另外归档吗&#xff1f;6、InfluxDB历史数据如何归档&#xff1f;7、太麻烦了&#xff0c;允许的话选择设施完备的InfluxDB云产品吧8、…...

c#编码技巧(十九):各种集合特点汇总

.NET 常用集合对比&#xff1a; .NET 常见的线程安全集合 .NET 只读集合...

Python中的__init__()函数

什么是__init__()函数? __init__()函数其实是用于初始化新建对象的状态&#xff0c;当你创建一个类的实例时&#xff0c;__init__()函数的方法就会被自动调用&#xff0c;允许你为对象设置初始属性或执行初始化操作。 接下来这里让我们举例说明&#xff1a; 首先&#xff0c…...

写的bug与调试

无论是代码中的逻辑混乱&#xff0c;还是环境配置引发的灾难&#xff0c;亦或是多人协作产生的诡异问题&#xff0c;都可以在这里分享。把你职业生涯里遇到或写过的最大 bug 故事讲出来&#xff0c;让大家一起感受那些惊心动魄、哭笑不得的瞬间&#xff0c;也为后来人敲响警钟吧…...

本地安装YAPI

项目中用到很多的RESTAPI&#xff0c;光靠人工管理或者普通文档肯定是不行的&#xff0c;翻了很多的RESTAPI管理工具&#xff0c;还是选择了YAPI&#xff0c;原因有2&#xff0c;一个是接口位于内网&#xff0c;外网网站上管理测试不到内网接口&#xff0c;另外一个是使用方式&…...

嵌入式Linux基于IMX6ULL tslib学习总结

目录 1. tslib开源库介绍1.1 tslib主要功能1.2 架构 2. tslib代码简单分析2.1 ts_print_mt.c分析代码2.2 ts_setup代码分析2.3 ts_open代码分析2.4 ts_config代码分析2.5 ts_read_mt代码分析2.6 tslib中4个模块的含义 3. 使用tslib库打印触摸屏2点之间的距离 基于韦东山IMX6ULL…...

pinia的使用

一、安装 Pinia 首先&#xff0c;确保你的项目已经安装了 Vue.js&#xff08;版本 3.x&#xff09;。如果没有&#xff0c;请先安装 Vue。 然后使用包管理器&#xff08;如 npm 或 yarn&#xff09;安装 Pinia&#xff1a; 通过 npm 安装&#xff1a;npm install pinia通过 ya…...

亚信安全携手飞书“走近先进” 与保隆科技探索制造业数字化转型

亚信安全携手飞书组织举办“走近先进”活动。近日活动“走近”了中国汽车供应链百强、上海市制造业五十强企业——上海保隆汽车科技股份有限公司&#xff08;以下简称“保隆科技”&#xff09;。活动围绕“突破桎梏 加速升级”的主题&#xff0c;聚焦企业数字化转型的核心议题&…...

mybatis-plus方法无效且字段映射失败错误排查

问题&#xff1a; Invalid bound statement (not found): com.htlc.assetswap.mapper.WalletMapper.insert&#xff0c;并且select * 进行查询时带下划线的字段未成功映射。 排查&#xff1a; 1.检查WalletMapper接口&#xff0c;确保继承自BaseMapper 2.启用驼峰命名法映射。a…...

poi模板动态导出,下拉框联动,公式设置

背景&#xff1a;有一个动态导出模板的需求&#xff0c;根据页面维护的数据比如模板名称&#xff0c;模板的sheet名称&#xff0c;列名称宽度高度等&#xff0c;导出excel文件。打破以往把excel上传到代码的resource中&#xff0c;或者文件服务中&#xff0c;再下载出来导入。这…...

string的实际应用 -- 大数相加 、大数相乘

前言&#xff1a;哎&#xff0c;做题好难o(╥﹏╥)o&#xff0c;有时候想不到&#xff0c;而有时候则是想到了却没办法理清思路&#xff0c;转化为代码。有必要反思了┓(;_&#xff40;)┏&#xff0c;是否是做的太少了&#xff0c;或是自己的基础欠缺。 大学总是有些迷茫~ ​​…...

16:(标准库)ADC三:使用外部触发启动ADC/模拟看门狗

使用外部触发启动ADC 1、外部中断线EXTI11触发ADC2、外部定时器TIM2_CH2触发ADC3、ADC中模拟看门狗的使用 1、外部中断线EXTI11触发ADC ADC的触发方式有很多&#xff0c;一般情况都是使用软件触发反式启动ADC转换。除了软件触发方式还能使用外部事件触发启动ADC转换。如下图所…...

前端框架 react 性能优化

目录 一、不使用任何性能优化API进行优化 二、通过性能优化API优化 1、React.memo 2、useCallback 3、useMemo 4、PureComponent 三、总结​ 总览&#xff1a;react的优化核心思想就是让react跳过重新渲染那个些没有改变的Component&#xff0c;而只重新渲染发生变化的C…...

一加ACE 3 Pro手机无法连接电脑传输文件问题

先说结论&#xff1a;OnePlus手机无法连接电脑传输数据的原因&#xff0c;大概率是一加数据线的问题。尝试其他手机品牌的数据线&#xff08;比如华为&#xff09;&#xff0c;再次尝试。 连接电脑方法&#xff1a; 1 打开开发者模式&#xff08;非必要操作&#xff09; 进入…...