android Recyclerview viewholder统一封装
Recyclerview holder 统一封装 ViewHolder类
import android.annotation.SuppressLint
import android.content.Context
import android.graphics.Color
import android.graphics.drawable.GradientDrawable
import android.os.Build
import android.os.CountDownTimer
import android.util.SparseArray
import android.view.View
import android.widget.ImageView
import android.widget.TextView
import androidx.annotation.RequiresApi
import androidx.recyclerview.widget.RecyclerView
import com.tongtong.feat_watch.utils.WGlide/*** @author: shuhuai* @desc:* @date: 2024/11/15* @version:* @remark*/
open class ViewHolder(itemView: View?) : RecyclerView.ViewHolder(itemView!!
) {private var countDownTimer: CountDownTimer? = null//用于缓存已找的界面private val mView = SparseArray<View>()fun <T : View?> getView(viewId: Int): T? {//对已有的view做缓存var view = mView[viewId]//使用缓存的方式减少findViewById的次数if (view == null) {view = itemView.findViewById(viewId)mView.put(viewId, view)}return view as T?}fun startCountDown(viewId: Int,remainingTime: Long,copywrit: String? = "",unit: TimeUnit = TimeUnit.SECOND,backgroundColor: String = "00000000",callback: (message: String?) -> Unit = { }) {val view = getView<TextView>(viewId)!!countDownTimer = object : CountDownTimer(remainingTime, unit.v) {@RequiresApi(Build.VERSION_CODES.S)override fun onTick(millisUntilFinished: Long) {view.apply {text = TimeUnit.formatTime(millisUntilFinished, unit) + copywritval bg = background as GradientDrawableval code = String.format("#%s", backgroundColor)bg.setColor(Color.parseColor(code))}}override fun onFinish() {callback.invoke("倒计时结束")}}.start()}fun cancelCountDown() {if (countDownTimer != null) {countDownTimer!!.cancel()}}fun destoryDown() {cancelCountDown()countDownTimer = null}//通用的功能进行封装 设置文本 设置条目点击事件 设置图片fun setText(viewId: Int, text: CharSequence?): ViewHolder {val view = getView<TextView>(viewId)!!view.text = text//希望可以链式调用return this}//通用的功能进行封装 设置文本 设置条目点击事件 设置图片fun setText(viewId: Int, text: String?): ViewHolder {val view = getView<TextView>(viewId)!!view.text = text//希望可以链式调用return this}fun setTextColor(viewId: Int, color: Int): ViewHolder {val view = getView<TextView>(viewId)!!view.setTextColor(color)//希望可以链式调用return this}fun setTextBackground(viewId: Int, color: Int): ViewHolder {val view = getView<TextView>(viewId)!!view.setBackgroundColor(color)//希望可以链式调用return this}fun setTextTypeface(viewId: Int, style: Int): ViewHolder {val view = getView<TextView>(viewId)!!view.setTypeface(null, style)//希望可以链式调用return this}fun setSelected(viewId: Int, selected: Boolean): ViewHolder {val view = getView<TextView>(viewId)!!view.isSelected = selected//希望可以链式调用return this}fun setSelected2(viewId: Int, selected: Boolean): ViewHolder {val view = getView<View>(viewId)!!view.isSelected = selectedreturn this}fun setVisible(viewId: Int, visible: Boolean): ViewHolder {val view = getView<View>(viewId)!!view.visibility = if (visible) View.VISIBLE else View.GONEreturn this}fun setVisible(viewId: Int, visible: Boolean, isLocation: Boolean): ViewHolder {val view = getView<View>(viewId)!!if (isLocation) {view.visibility = if (visible) View.VISIBLE else View.INVISIBLE} else {view.visibility = if (visible) View.VISIBLE else View.GONE}return this}/*** 设置本地图片* @param viewId* @param resId* @return*/fun setImageResource(viewId: Int, resId: Int): ViewHolder {val iv = getView<ImageView>(viewId)!!iv.setImageResource(resId)return this}fun setDrawable(mContext: Context?, viewId: Int, resId: Int): ViewHolder {val v = getView<View>(viewId)!!v.setBackgroundDrawable(mContext?.resources?.getDrawable(resId))return this}fun setTextSelected(viewId: Int, bool: Boolean): ViewHolder {val tv = getView<TextView>(viewId)!!tv.isSelected = boolreturn this}/*** 设置本地图片* @param viewId* @param resId* @return*/fun setImageDrawable(mContext: Context, viewId: Int, resId: Int): ViewHolder {val iv = getView<ImageView>(viewId)!!iv.setImageDrawable(mContext.getResources().getDrawable(resId))return this}/*** 加载图片资源路径* @param viewId* @param imageLoader* @return*/fun setImagePath(viewId: Int, imageLoader: HolderImageLoader, res: Int): ViewHolder {val iv = getView<ImageView>(viewId)!!imageLoader.loadImage(iv, imageLoader.path, res)return this}fun setImageGrey(mContext: Context?, viewId: Int, url: String?): ViewHolder {val view = getView<ImageView>(viewId)!!WGlide.setImageGrey(mContext, view, url)return this}fun setImage(mContext: Context?, viewId: Int, url: String?): ViewHolder {val view = getView<ImageView>(viewId)!!WGlide.setImage(mContext, view, url)return this}fun setImage(mContext: Context?, viewId: Int, url: String?, res: Int): ViewHolder {val view = getView<ImageView>(viewId)!!WGlide.setImage(mContext, view, url)return this}fun setImage(mContext: Context?,viewId: Int,url: String?,width: Int?,height: Int?): ViewHolder {val view = getView<ImageView>(viewId)!!WGlide.setImage(mContext, view, url, width, height)return this}fun setImageRadius(mContext: Context?,viewId: Int,url: String?,radius: Float = 0f,): ViewHolder {val view = getView<ImageView>(viewId)!!WGlide.setImageRadius(mContext, view, url, radius)return this}fun setImageRadiusForTop(mContext: Context?,viewId: Int,url: String?,radiusTL: Float = 0f,radiusTR: Float = 0f,): ViewHolder {val view = getView<ImageView>(viewId)!!WGlide.setImageRadius(mContext, view, url, 0f, radiusTL, radiusTR)return this}@SuppressLint("NewApi")fun setBackground(mContext: Context, viewId: Int, bg: Int): ViewHolder {val tv = getView<View>(viewId) as TextViewtv.background = mContext.getResources().getDrawable(bg)return this}/*** 关于事件的*/fun setOnClickListener(viewId: Int, listener: View.OnClickListener?): ViewHolder {val view = getView<View>(viewId)!!view.setOnClickListener(listener)return this}abstract class HolderImageLoader(mContext: Context, var path: String) {var mContext: Context = mContext/*** 需要去复写这个方法加载图片* @param iv* @param path*/abstract fun loadImage(iv: ImageView?, path: String?, res: Int)}
}enum class TimeUnit(val v: Long) {DAY(24 * 60 * 60 * 1000),HOUR(60 * 60 * 1000),MINUTE(60 * 1000),HOUR_UN_SECOND(60 * 1000),HOUR_UN_SECOND_NO_ZERO(1000),SECOND(1000);companion object {fun formatTime(millis: Long, unit: TimeUnit): String {val totalSeconds: Long = millis / 1000val days: Long = totalSeconds / (24 * 3600) // 每天86400秒,24*3600val hours: Long = (totalSeconds % (24 * 3600)) / 3600 // 取余后计算小时val minutes: Long = (totalSeconds % 3600) / 60 // 取余后计算分钟val seconds: Long = totalSeconds % 60 // 取余后计算秒var time = "${days}天${hours}时${minutes}分${seconds}秒"if (unit == HOUR) {time = "${(hours + days * 24)}时${minutes}分${seconds}秒"} else if (unit == MINUTE) {time = "${minutes + (hours + days * 24) * 60}分${seconds}秒"} else if (unit == SECOND) {time = "${seconds + (minutes + (hours + days * 24) * 60) * 60}秒"} else if (unit == HOUR_UN_SECOND) {val _hour = hours + days * 24if (_hour > 0) {time = "${(hours + days * 24)}时${minutes}分"} else {time = "${minutes}分"}} else if (unit == HOUR_UN_SECOND_NO_ZERO) {val _hour = hours + days * 24if (_hour > 0) {time = "${(hours + days * 24)}时${minutes}分"} else {if (minutes > 0) {time = "${minutes}分"} else {time = "${seconds}秒"}}}return time;}}
}
具体实现
import android.content.Context
import android.view.LayoutInflater
import android.view.ViewGroup
import androidx.recyclerview.widget.RecyclerView
import com.tongtong.feat_watch.R
import com.tongtong.feat_watch.ui.hall.bean.HallBean
import com.tongtong.feat_watch.ui.paly.view.scroll.ViewHolder/*** @author: shuhuai* @desc:* @date: 2025/1/15* @version:* @remark*/
class MyAdapter(context: Context?) :RecyclerView.Adapter<ViewHolder?>() {override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder = ViewHolder(LayoutInflater.from(parent?.context).inflate(R.layout.fragment_hall, parent, false))override fun onBindViewHolder(holder: ViewHolder, position: Int) {TODO("Not yet implemented")}override fun getItemCount(): Int {TODO("Not yet implemented")}
}
相关文章:
android Recyclerview viewholder统一封装
Recyclerview holder 统一封装 ViewHolder类 import android.annotation.SuppressLint import android.content.Context import android.graphics.Color import android.graphics.drawable.GradientDrawable import android.os.Build import android.os.CountDownTimer import…...

Windows部署NVM并下载多版本Node.js的方法(含删除原有Node的方法)
本文介绍在Windows电脑中,下载、部署NVM(node.js version management)环境,并基于其安装不同版本的Node.js的方法。 在之前的文章Windows系统下载、部署Node.js与npm环境的方法(https://blog.csdn.net/zhebushibiaoshi…...

51单片机入门基础
目录 一、基础知识储备 (一)了解51单片机的基本概念 (二)掌握数字电路基础 (三)学习C语言编程基础 二、开发环境搭建 (一)硬件准备 (二)软件准备 三、…...
老centos7 升级docker.io为docker-ce 脚本
旧的centos7 之前安装的是docker.io 由于一些原因,像docker compose 等版本变化,以及docker.io源受限等,我们要更新到docker-ce 并使用国内阿里云的源怎么处理?下面直接上脚本,upgrade-docker.sh #!/bin/bashset -e# 创建临时目录 TEMP_DIR"./tmp" mkdir -p "…...

数仓建模(三)建模三步走:需求分析、模型设计与数据加载
本文包含: 数据仓库的背景与重要性数据仓库建模的核心目标本文结构概览:需求分析、模型设计与数据加载 目录 第一部分:需求分析 1.1 需求分析的定义与目标 1.2 需求分析的步骤 1.2.1 业务需求收集 1.2.2 技术需求分析 1.2.3 成果输出…...
PHP xml 常用函数整理
————————-DOM 函数————————————– 1、DOMDocument->load() 作用:加载xml文件 用法:DOMDocument->load( string filename ) 参数:filename,xml文件; 返回:如果成功则返回 TRUE&a…...

数据结构(Java版)第八期:LinkedList与链表(三)
专栏:数据结构(Java版) 个人主页:手握风云 目录 一、链表中的经典面试题 1.1. 链表分割 1.2. 链表的回文结构 1.3. 相交链表 1.4. 环形链表 一、链表中的经典面试题 1.1. 链表分割 题目中要求不能改变原来的数据顺序,也就是如上图所示。…...
数据结构学习记录-数据结构概念
1 数据结构: 数据结构是计算机存储,管理数据的方式。 数据必须依据某种逻辑联系组织在一起存储在计算机内 数据结构研究的就是这种数据的存储结构和数据的逻辑结构。 1.1 数据的逻辑结构: 逻辑结构指的是数据本身之间的关系 集合&#x…...

【Linux】11.Linux基础开发工具使用(4)
文章目录 3. Linux调试器-gdb使用3.1 背景3.2 下载安装3.3 使用gdb查询3.4 开始使用 3. Linux调试器-gdb使用 3.1 背景 程序的发布方式有两种,debug模式和release模式 Linux gcc/g出来的二进制程序,默认是release模式 要使用gdb调试,必须…...
数据结构与算法之栈: LeetCode 1047. 删除字符串中的所有相邻重复项 (Ts版)
删除字符串中的所有相邻重复项 https://leetcode.cn/problems/remove-all-adjacent-duplicates-in-string/ 描述 给出由小写字母组成的字符串 s,重复项删除操作会选择两个相邻且相同的字母,并删除它们在 s 上反复执行重复项删除操作,直到无…...
C++ 在线编译软件介绍、杭电OJ、北大OJ、力扣OJ
在线编译软件的话,可见下: https://www.jyshare.com/compile/12/ 杭州电子科技大学开发的一个免费的写代码地址 ,杭电OJ https://bestcoder.hdu.edu.cn/ 北大OJ http://poj.org/ 力扣OJ 力扣 (LeetCode) 全球极客挚爱的技术成长平台...
Java学习笔记(二十三)
1 CacheEvict CacheEvict是Spring框架中用于清空缓存的注解。以下是对CacheEvict注解的详细介绍: 1.1 作用 CacheEvict注解的主要作用是删除缓存中的数据。在方法执行后或执行前(根据配置),它可以清空指定的缓存项或整个缓存区…...
《AI赋能鸿蒙Next,开启智能关卡设计新时代》
在游戏开发领域,关卡设计是至关重要的一环,它直接影响着玩家的游戏体验和沉浸感。而随着人工智能技术的飞速发展,结合鸿蒙Next系统的强大功能,为游戏的智能关卡设计带来了全新的思路和方法。 利用AI学习玩家行为模式 在鸿蒙Next…...

js:正则表达式
目录 正则表达式的语法 定义 检测 检索 元字符 边界符 量词 字符类 表单判断案例 修饰符 过滤敏感词 正则表达式是一种用于匹配和操作文本的强大工具,它是由一系列字符和特殊字符组成的模式,用于描述要匹配的文本字符组合模式 正则表达式是一…...
linux环境使用docker部署多个war项目
如果你的需求是在一个服务器上部署多个Tomcat项目,并且每个项目需要独立运行,可以通过以下方式实现: 1. 使用不同的端口 每个Tomcat项目可以使用不同的端口号(如9090、9091、9092等),并通过Docker容器分别…...
【react】使用antd Table渲染数据遇到的报错问题
记录自己在开发过程中遇到的报错问题: 目录 原本写法:错误分析:解决方案: 原本写法: render: (text) > {console.log(text, "111111text");console.log(typeof text, "111111text");return t…...

JVM之垃圾回收器G1概述的详细解析
G1(并发) G1 特点 G1(Garbage-First)是一款面向服务端应用的垃圾收集器,应用于新生代和老年代、采用标记-整理算法、软实时、低延迟、可设定目标(最大 STW 停顿时间)的垃圾回收器,用于代替 CMS࿰…...

1.15寒假作业
web:nss靶场ez_ez_php 打开环境,理解代码 使用个体传参的方法,首先代码会检查file参数的前三个字符是不是php,如果是就输出nice,然后用include函数包含file,绕过不是则输出hacker,如果没有file…...

RK356x bsp 5 - 海华AW-CM358SM Wi-Fi/Bt模组调试记录
文章目录 1、环境介绍2、目标3、海华AW-CM358SM3.1、基本信息3.2、支持SDIO3.03.3、电气特性 4、适配流程步骤5、SDIO控制器适配5.1、sdio dts配置5.2、验证 6、Wi-Fi 适配6.1、wifi dts配置6.2、驱动移植6.2.1、kernel menuconfig6.2.2、传统驱动移植6.2.3、RK SDK WIFI/BT驱动…...
支持Google Analytics快捷添加的CMS:费用与部署形式详解
CMS 的费用和部署形式是选择平台的重要参考因素,不同的业务需求需要不同的解决方案。本文将从费用和部署形式两个角度,详细分析支持 Google Analytics 快捷集成的 CMS 和工具,帮助您更好地了解这些平台的特点。 1. BigCommerce 费用ÿ…...

CSS | 实现三列布局(两边边定宽 中间自适应,自适应成比)
目录 示例1 (中间自适应 示例2(中间自适应 示例3(中间自适应 示例4 (自适应成比 示例5(左中定宽,右边自适应 示例6(中间自适应 示例7(中间自适应 示例8(中间定宽…...

fpga系列 HDL:跨时钟域同步 双触发器同步器
目录 **双触发器同步器(Two-Flip-Flop Synchronizer)示例代码**:双触发器同步器的优缺点优点:缺点:适用场景: 应用实例:同步来自spi_slave的单个使能信号 跨时钟域的设计需要特别小心࿰…...

金融项目实战 05|Python实现接口自动化——登录接口
目录 一、代码实现自动化理论及流程 二、脚本实现的理论和准备工作 1、抽取功能转为自动化用例 2、搭建环境(测试工具) 3、搭建目录结构 三、登录接口脚本实现 1、代码编写 1️⃣api目录 2️⃣script目录 2、断言 3、参数化 1️⃣编写数据存储文件:jso…...

《HTML在网络安全中的多面应用:从防范攻击到安全审查》
Html基础 Html简介 HTML(HyperText Markup Language,超文本标记语言)是用于描述网页内容和结构的标准语言。以下是对HTML的简要介绍: 基本概念 定义: HTML不是一种编程语言,而是一种标记语言。 它使用标…...

Linux网络 | 学习传输层网络协议之UDP(短篇)
前言: 本节内容正式迈入传输层网络协议的知识殿堂, 之前的文章, 我们都是在应用层进行翻来覆去。 比如http就是应用层协议, 只不过使用了tcp的系统调用。 从本节开始, 友友们将会学习传输层两大协议: UDP和…...
iOS - 内存屏障的使用场景
内存屏障的使用是为了解决以下几个关键问题: 1. CPU 乱序执行 // 没有内存屏障时,CPU 可能乱序执行 void example() {// 这两行代码可能被 CPU 重排序a 1; // 操作1flag true; // 操作2 }// 使用内存屏障确保顺序 void safeExample() {a 1;…...
MySQL 8.0 新特性详解与实用示例
MySQL 8.0 新特性详解与实用示例 1. 引言 MySQL 8.0 是 MySQL 版本系列中具有里程碑意义的更新版本,带来了大量新功能和优化,极大地提升了数据库的性能和可用性。本文将深入介绍 MySQL 8.0 的主要新特性及其应用场景,帮助你在项目中更高效地…...

【STM32-学习笔记-5-】ADC
文章目录 ADCADC函数Ⅰ、ADC_InitTypeDef结构体参数①、ADC_Mode②、ADC_DataAlign③、ADC_ExternalTrigConv④、ADC_ContinuousConvMode⑤、ADC_ScanConvMode⑥、ADC_NbrOfChannel Ⅱ、ADC配置示例1、单次转换,非扫描单次转换非扫描模式下,获取多通道的…...

TY1801 反激变换器PWM GaN功率开关
TY1801 是一款针对离线式反激变换器的多模式 PWM GaN 功率开关。TY1801 内置 GaN 功率管,它具备超宽 的 VCC 工作范围,非常适用于 PD 快充等要求宽输出电压的应用场合,系统不需要使用额外的绕组或外围降压电路,节省系统 BOM 成本。TY1801 支持 Burst&…...

Jenkins安装、插件下载及构建环境配置详解
Jenkins简介 1.1 简介 Jenkins 是一个基于Java开发的开源持续集成工具,它提供了一个开放且易用的软件平台,主要用于自动化构建、测试和部署软件项目,以实现持续集成(CI)和持续交付/部署(CD)。…...