我的编程空间,编程开发者的网络收藏夹
学习永远不晚

怎么在Android中实现列表倒计时

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

怎么在Android中实现列表倒计时

怎么在Android中实现列表倒计时?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。

CountDownTimer类用法

  private CountDownTimer timer = new CountDownTimer(30000, 1000) {     //根据间隔时间来不断回调此方法,这里是每隔1000ms调用一次    @Override     public void onTick(long millisUntilFinished) {       //todo millisUntilFinished为剩余时间,也就是30000 - n*1000    }         //结束倒计时调用      @Override     public void onFinish() {       //todo    } }; //开始倒计时timer.start();//取消倒计时(译者:取消后,再次启动会重新开始倒计时)timer.cancel();;

代码实现

先看核心,也就是CountDownAdapter类,这里就简化UI,每个item只有一个textView来显示倒计时,布局XML就不放了,直接放代码

class CountDownAdapter(private var activity: ListActivity, private var data: ArrayList<Date>, private var systemDate: Date) : BaseAdapter() {  private val timeMap = HashMap<TextView, MyCountDownTimer>()  private val handler = Handler()  private val runnable = object : Runnable {    override fun run() {      if (systemDate != null) {        systemDate.time = systemDate.time + 1000        Log.i("xujf", "服务器时间线程===" + systemDate + "==for==" + this)        handler.postDelayed(this, 1000)      }    }  }  init {    handler.postDelayed(runnable, 1000)  }  override fun getView(position: Int, convertView: View?, parent: ViewGroup?): View {    var v: View    var tag: ViewHolder    var vo = data[position]    if (null == convertView) {      v = activity.layoutInflater.inflate(R.layout.item_count_down, null)      tag = ViewHolder(v)      v.tag = tag    } else {      v = convertView      tag = v.tag as ViewHolder    }    //获取控件对应的倒计时控件是否存在, 存在就取消, 解决时间重叠问题    var tc: MyCountDownTimer? = timeMap[tag.tvTime]    if (tc != null) {      tc.cancel()      tc = null    }    //计算时间差    val time = getDistanceTimeLong(systemDate, vo)    //创建倒计时,与控件绑定    val cdu = MyCountDownTimer(position, time, 1000, tag.tvTime)    cdu.start()    //[醒目]此处需要map集合将控件和倒计时类关联起来    timeMap.put(tag.tvTime, cdu)    return v  }    fun cancelAllTimers() {    var s: Set<MutableMap.MutableEntry<TextView, MyCountDownTimer>>? = timeMap.entries    var it: Iterator<*>? = s!!.iterator()    while (it!!.hasNext()) {      try {        val pairs = it.next() as MutableMap.MutableEntry<*, *>        var cdt: MyCountDownTimer? = pairs.value as MyCountDownTimer        cdt!!.cancel()        cdt = null      } catch (e: Exception) {      }    }    it = null    s = null    timeMap.clear()  }  fun removeTimer(){    handler?.removeCallbacks(runnable)  }  fun reSetTimer(date: Date) {    removeTimer()    systemDate = date    handler.postDelayed(runnable, 1000)  }  override fun getItem(position: Int): Any = data[position]  override fun getItemId(position: Int): Long = 0L  override fun getCount(): Int = data.size  internal inner class ViewHolder(view: View) {    var tvTime = view.findViewById<TextView>(R.id.tv_time)  }    private inner class MyCountDownTimer(internal var index: Int, millisInFuture: Long,                     internal var countDownInterval: Long, internal var tv: TextView  ) : CountDownTimer(millisInFuture, countDownInterval) {    override fun onTick(millisUntilFinished: Long) {      //millisUntilFinished为剩余时间长      Log.i("xujf", "====倒计时还活着===第 $index 项item======")      //设置时间格式      val m = millisUntilFinished / countDownInterval      val hour = m / (60 * 60)      val minute = (m / 60) % 60      val s = m % 60      tv.text = "倒计时 (${hour}小时${minute}分${s}秒)"    }    override fun onFinish() {      tv.text = "倒计时结束"      //todo 可以做一些刷新动作    }  }    fun getDistanceTimeLong(one: Date, two: Date): Long {    var diff = 0L    try {      val time1 = one.time      val time2 = two.time      if (time1 < time2) {        diff = time2 - time1      } else {        diff = time1 - time2      }    } catch (e: Exception) {      e.printStackTrace()    }    return diff  }}

这里主要的创建一个线程来保持服务器时间和N个item倒计时的“走”动。

保持服务器时间没什么好说的,就是Handler配合Runnable的循环调用,注意的是,当activity销毁时,别忘了调用CountDownAdapter的removeTimer()方法来取消handler的回调,防止内存泄漏。

重点就是item里的倒计时的线程控制,这里参照网上的一个比较好的方法,就是用HashMap<TextView, MyCountDownTimer>()来让MyCountDownTimer和item里的TextView关联起来,也就是每个item对应一个CountDownTimer,当关闭页面时或者刷新list时,可利用cancelAllTimers()方法来清除所有关联,避免内存泄漏。

以下是ListActivity,伪造一些时间数据

class ListActivity : AppCompatActivity() {  private val list: ArrayList<Date> = ArrayList()  private var countDownAdapter: CountDownAdapter? = null  override fun onCreate(savedInstanceState: Bundle?) {    super.onCreate(savedInstanceState)    setContentView(R.layout.activity_list)    getDate()    setDate()  }  private fun setDate() {    if (countDownAdapter == null) {      countDownAdapter = CountDownAdapter(this, list, Date())      lv_count_down.adapter = countDownAdapter      lv_count_down.onItemClickListener = AdapterView.OnItemClickListener { adapterView, view, i, l ->        val intent = Intent(ListActivity@this, Main2Activity::class.java)        startActivity(intent)      }    } else {      //刷新数据时,重置本地服务器时间      countDownAdapter!!.reSetTimer(Date())      countDownAdapter!!.notifyDataSetChanged()    }  }  private fun getDate() {    for (i in 1..20) {      var date = Date(Date().time + i * 1000 * 60 * 30)      list.add(date)    }  }  override fun onDestroy() {    countDownAdapter?.cancelAllTimers()    countDownAdapter?.removeTimer()    super.onDestroy()  }}

这里在销毁activity前,清除了服务器时间线程和所有item计时器,防止关闭页面后线程失控而导致的内存泄漏。但是并没有在打开其他页面时清除,因为如果清除了的话,那么从其他界面返回至此activity时,倒计时已停止。

当然如果你的需求允许返回界面时重新请求加载数据的,可以在onStop()中,只不过这样体验不好

countDownAdapter?.cancelAllTimers()countDownAdapter?.removeTimer()

运行效果

这里就看下我跑模拟机运行demo打印的Log:

怎么在Android中实现列表倒计时

嗯,本地的服务器时间每秒一次再跑着,没毛病。

再来看看item里的倒计时Log:

怎么在Android中实现列表倒计时

看完上述内容,你们掌握怎么在Android中实现列表倒计时的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注编程网行业资讯频道,感谢各位的阅读!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

怎么在Android中实现列表倒计时

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

怎么在Android中实现列表倒计时

怎么在Android中实现列表倒计时?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。CountDownTimer类用法 private CountDownTimer timer
2023-05-30

怎么在Android中实现一个倒计时功能

本篇文章给大家分享的是有关怎么在Android中实现一个倒计时功能,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。以30分钟为例写的一个倒计时:public class Main
2023-05-31

Android中怎么使用flow实现倒计时

本篇内容主要讲解“Android中怎么使用flow实现倒计时”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Android中怎么使用flow实现倒计时”吧!现在因为有了协程和Flow,我们可以借助
2023-06-30

Android中怎么实现一个倒计时效果

今天就跟大家聊聊有关Android中怎么实现一个倒计时效果,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。需求:a.在后台添加时,如果是今日直播,则需要添加开始时间(精确到秒);b.离
2023-05-30

怎么在Android中利用CountDownTimer实现一个倒计时功能

这篇文章主要介绍了怎么在Android中利用CountDownTimer实现一个倒计时功能,此处通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考价值,需要的朋友可以参考下:Android是什么Android是一种基于Lin
2023-05-30

怎么在Android中实现一个启动页倒计时效果

本篇文章为大家展示了怎么在Android中实现一个启动页倒计时效果,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。Android是什么Android是一种基于Linux内核的自由及开放源代码的操作系统
2023-06-14

Android中CountDownTimer 实现倒计时功能

CountDownTimerCountDownTimer 是android 自带的一个倒计时类,使用这个类可以很简单的实现 倒计时功能CountDownTimer 的实现方式 new CountDownTimer(6000,1000) {/
2023-05-31

Android怎样实现倒计时功能

这篇文章主要为大家展示了“Android怎样实现倒计时功能”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Android怎样实现倒计时功能”这篇文章吧。一. 已有倒计时方案存在的问题在开发倒计时功
2023-06-25

怎么在Linux中实现“时分秒“倒计时功能

这篇文章给大家介绍怎么在Linux中实现“时分秒“倒计时功能,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。1.怎样实现“时分秒“倒计时在Linux下,脚本的完成相对于C语言来说稍微随意一点,可以按照字的想法写,只要有逻
2023-06-09

Android中如何实现倒计时验证

这篇文章主要介绍了Android中如何实现倒计时验证,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。短信验证码功能,这里总结了两种常用的方式,可以直接拿来使用。看图:说明:这里
2023-05-31

php怎么实现倒计时

本篇内容介绍了“php怎么实现倒计时”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!php实现倒计时的方法:1、通过date_default_
2023-06-25

怎么在Android应用中利用View实现一个倒计时功能

这篇文章将为大家详细讲解有关怎么在Android应用中利用View实现一个倒计时功能,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。Android 自定义View实现倒计时需求:具体方法如下:
2023-05-31

VBScript中怎么实现倒计时功能

这篇文章给大家介绍VBScript中怎么实现倒计时功能,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。---- 要实现倒计时,主要用到的是一个时间函数: DateDIFF(),它的作用是求出两个日期之间的时间间隔。它的格
2023-06-03

怎么在Android应用中实现一个信验证码倒计时功能

这篇文章将为大家详细讲解有关怎么在Android应用中实现一个信验证码倒计时功能,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。实现步骤:1、一个关键类:CountDownTimer(Andr
2023-05-31

python列表切片倒序怎么实现

可以使用切片操作符`[::-1]`来实现列表的倒序。例如:lst = [1, 2, 3, 4, 5]reversed_lst = lst[::-1]print(reversed_lst) # 输出 [5, 4, 3, 2, 1]使
2023-10-24

Android中Handler实现倒计时的两种方式

背景:最近项目中,正好做到登录/注册这个功能块。它需要通过发送验证码,在规定的时间内用验证码来完成登录/注册。之前的项目中也有这个功能,但是觉得太复杂了,只好自己重新实现一遍。用Handler来做,觉得代码简介,逻辑也清楚。代码一://在向
2023-05-31

Android 中不用线程如何实现倒计时

需求: 有多个组件可以开启倒计时,正常情况下默认倒计时时间终了后更新UI,另,用户可以取消指定倒计时。 这里使用CountDownTimer进行倒计时,其中回调函数onFinish是在倒计时终了时回调,onTick是在倒计时开始时回调,用户
2022-06-06

Android中怎么利用CountDownTimer实现验证码倒计时效果

今天就跟大家聊聊有关Android中怎么利用CountDownTimer实现验证码倒计时效果,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。1、需求分析点击按钮之后,按钮文字变为“ns
2023-05-30

怎么在Android中利用控件实现一个验证码倒计时功能

这期内容当中小编将会给大家带来有关怎么在Android中利用控件实现一个验证码倒计时功能,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。使用方式
2023-05-31

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录