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 费用ÿ…...
实战指南|OpenWrt磁盘扩容全流程解析与避坑技巧
1. 为什么需要给OpenWrt扩容? 很多朋友第一次接触OpenWrt时都会遇到一个尴尬的问题:系统默认分配的存储空间太小了。我自己刚开始用OpenWrt时也踩过这个坑,当时想装个Docker跑点服务,结果发现连最基本的镜像都拉不下来。这就像给…...
Kandinsky-5.0-I2V-Lite-5s开源模型部署:无需代码基础的图形化AI视频工具
Kandinsky-5.0-I2V-Lite-5s开源模型部署:无需代码基础的图形化AI视频工具 1. 产品介绍 Kandinsky-5.0-I2V-Lite-5s是一款革命性的图生视频AI工具,它将复杂的视频制作过程简化为几个简单的点击操作。不同于传统需要专业剪辑软件和技能的视频制作方式&am…...
深入浅出:从原理到实践,手把手教你理解并校准RV1126 ISP的黑电平(BLC)
深入浅出:从原理到实践,手把手教你理解并校准RV1126 ISP的黑电平(BLC) 在数字图像处理领域,黑电平校准(Black Level Calibration, BLC)是一个看似简单却至关重要的环节。想象一下,当你用专业相机拍摄星空时…...
基于LSTM的CasRel模型变体实现与性能对比分析
基于LSTM的CasRel模型变体实现与性能对比分析 最近在关系抽取这个领域,大家的目光似乎都被Transformer架构给吸引走了。确实,像BERT、RoBERTa这些基于自注意力机制的模型,在各类NLP任务上表现都相当亮眼。但这就让我产生了一个疑问ÿ…...
Qwen3-0.6B-FP8详细步骤:WebUI中max_new_tokens参数设置避坑指南
Qwen3-0.6B-FP8详细步骤:WebUI中max_new_tokens参数设置避坑指南 1. 引言:一个参数引发的“血案” 最近在折腾Qwen3-0.6B-FP8这个轻量级模型时,我遇到了一个挺有意思的问题。当时我正在测试它的“思考模式”——就是那个能展示模型内部推理…...
新手入门指南:在快马平台用AI生成代码理解云桌面基础概念
今天想和大家分享一个特别适合新手理解云桌面基础概念的实践方法。作为一个刚接触云计算的小白,我最初对"一台主机创建多个云桌面"这个概念也是一头雾水,直到在InsCode(快马)平台上尝试用AI生成代码来模拟这个过程,才真正搞明白其中…...
ICLR 2026 | 告别Top-K检索!RF-Mem在嵌入空间逐步重构证据链,实现长记忆渐进式唤醒
今天分享一篇来自大连理工大学、香港城市大学、华为和中国科学技术大学的最新工作 RF-Mem,发表于ICLR 2026。这篇工作关注个性化大模型中的一个关键问题:当用户历史越来越长时,模型到底该怎样从海量记忆里,准确找回“此时此刻最相…...
ide-eval-resetter:突破JetBrains IDE试用期限制的创新方案——2026开发者必备指南
ide-eval-resetter:突破JetBrains IDE试用期限制的创新方案——2026开发者必备指南 【免费下载链接】ide-eval-resetter 项目地址: https://gitcode.com/gh_mirrors/id/ide-eval-resetter 问题引入:JetBrains IDE试用期限制的痛点分析 作为开发…...
灵毓秀-牧神-造相Z-Turbo使用全攻略:从环境检查到作品输出
灵毓秀-牧神-造相Z-Turbo使用全攻略:从环境检查到作品输出 1. 镜像简介与核心功能 灵毓秀-牧神-造相Z-Turbo是一款基于Xinference部署的AI文生图模型服务,专门用于生成《牧神记》中灵毓秀角色的高质量图像。该镜像集成了Gradio交互界面,让用…...
PyTorch 2.8镜像实际效果:torch.compile+FlashAttention-2双优化下的吞吐量提升对比
PyTorch 2.8镜像实际效果:torch.compileFlashAttention-2双优化下的吞吐量提升对比 1. 镜像环境与技术亮点 PyTorch 2.8深度学习镜像为开发者提供了一个开箱即用的高性能计算环境。基于RTX 4090D 24GB显卡和CUDA 12.4的深度优化组合,这个镜像特别适合需…...
