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 费用ÿ…...
H5扫码功能选型实战:微信JS-SDK vs 纯前端库,从公众号配置到代码封装的完整流程
H5扫码功能选型实战:微信JS-SDK vs 纯前端库的技术决策指南 当营销活动页需要实现"扫码领优惠券"功能时,技术团队突然陷入争论:是直接调用微信JS-SDK,还是采用纯前端扫码库?这个看似简单的技术决策ÿ…...
BiliBiliCCSubtitle:高效解决B站字幕处理难题全攻略
BiliBiliCCSubtitle:高效解决B站字幕处理难题全攻略 【免费下载链接】BiliBiliCCSubtitle 一个用于下载B站(哔哩哔哩)CC字幕及转换的工具; 项目地址: https://gitcode.com/gh_mirrors/bi/BiliBiliCCSubtitle 一、问题篇:字幕处理的真实困境与技术…...
GreenLuma 2025管理器:Steam游戏库高效管理与解锁解决方案
GreenLuma 2025管理器:Steam游戏库高效管理与解锁解决方案 【免费下载链接】GreenLuma-2025-Manager An app made in python to manage GreenLuma 2025 AppList 项目地址: https://gitcode.com/gh_mirrors/gr/GreenLuma-2025-Manager 在数字娱乐日益丰富的今…...
Phi-4-mini-reasoning:轻量级推理模型在人工智能浪潮中的定位
Phi-4-mini-reasoning:轻量级推理模型在人工智能浪潮中的定位 1. 轻量级推理模型的时代价值 当ChatGPT等千亿参数大模型占据媒体头条时,一个容易被忽视的趋势正在悄然兴起——轻量级推理模型正在特定领域展现出惊人的实用性。Phi-4-mini-reasoning正是…...
PDF智能解析新选择:GLM-OCR支持表格/公式识别,效果惊艳
PDF智能解析新选择:GLM-OCR支持表格/公式识别,效果惊艳 1. 为什么需要新一代OCR技术 在日常办公和学术研究中,PDF文档处理一直是个令人头疼的问题。传统OCR工具在面对复杂版式、嵌套表格或数学公式时,往往表现不佳。想象一下这样…...
零基础如何用罗技鼠标宏实现绝地求生自动压枪?高效配置指南
零基础如何用罗技鼠标宏实现绝地求生自动压枪?高效配置指南 【免费下载链接】logitech-pubg PUBG no recoil script for Logitech gaming mouse / 绝地求生 罗技 鼠标宏 项目地址: https://gitcode.com/gh_mirrors/lo/logitech-pubg 你是否在《绝地求生》中因…...
GLM-4.1V-9B-Base保姆级教学:Web界面截图+问题输入框最佳实践
GLM-4.1V-9B-Base保姆级教学:Web界面截图问题输入框最佳实践 1. 认识GLM-4.1V-9B-Base GLM-4.1V-9B-Base是智谱开源的视觉多模态理解模型,专门用于处理图像内容识别、场景描述、目标问答和中文视觉理解任务。这个模型已经完成了Web化封装,可…...
5块钱的国产RISC-V芯片CH32V103能干啥?我用它复刻了一个STM32F103的小项目
5元国产RISC-V芯片实战:用CH32V103复刻STM32经典项目 在电子DIY领域,成本始终是创客们无法回避的现实问题。当我在某电商平台发现CH32V103这颗标价仅5元的RISC-V芯片时,第一反应是怀疑它的实用性——毕竟同级别的STM32F103C8T6价格通常在15-2…...
Git从入门到精通:完整学习路线图,全面详细一次过
Git超详细使用教程:从入门到高级(全面详解|目录结构|口语化专业双轨|长文警告) ⚠️ 长文警告:全文共 6218 字,覆盖 Git 全生命周期操作,含 18 个核心章节、7 张结构化对…...
