Android 自定义倒计时,支持listview多item一起倒计时

项目中用到的两种倒计时,一种是用CountDownTimer,但是这种方式在listview中就不是那么好用了,当listview 里面多个item都需要倒计时,就不可以用这种了,我这里想到用Thread 加handler来一起实现。如果大家还有好的倒计时方法,可以留言一起讨论哦,由于代码都是在项目中的,我就截取几段代码。

第一种 CountDownTimer:
主要自定义一个类继承CountDownTimer,在启动的时候调用start(),倒计时完毕调用canel()方法。


    time = new TimeCount(remainingTime, 1000);//构造CountDownTimer对象
    time.start();//开始计时

class TimeCount extends CountDownTimer {
        public TimeCount(long millisInFuture, long countDownInterval) {
            super(millisInFuture, countDownInterval);
        }

        @Override
        public void onFinish() {//计时完毕时触发
            if (isDead) {
                remainingTime = 90000;
                ColorStateList colorStateList = getResources().getColorStateList(R.color.button_send_code_text2_selector);
                getCode.setTextColor(colorStateList);
                getCode.setText(R.string.register_tip7);
                getCode.setEnabled(true);
            }

        }

        @Override
        public void onTick(long millisUntilFinished) {//计时过程显示
            if (isDead) {
                getCode.setEnabled(false);
                getCode.setTextColor(getResources().getColor(R.color.grey5));
                remainingTime = millisUntilFinished;
                getCode.setText(millisUntilFinished / 1000 + "秒后重发");
            }
        }
    }

第二种 Thread 加handler

创建一个新的线程,每秒中减一次时间,然后在handler中每秒中刷新一次界面就可以看到倒计时的效果。

  private Thread thread;

    //条目倒计时
    public void start() {
        thread = new Thread() {
            public void run() {
                while (true) {
                    try {
                        if (list != null) {
                            for (InvestProjectVo item : list) {

                                if(item.remainOpenTime == 0){
                                    item.status = 0;
                                }

                                if(item.remainOpenTime > 0){
                                    item.remainOpenTime = item.remainOpenTime - 1;
                                }
                            }
                        }
                        sleep(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        };
        thread.start();
    }

在adapter的getview()方法中,判断倒计时时间是否大于0,如果大于零可以继续显示倒计时时间

                    if (vo.remainOpenTime != 0 && vo.remainOpenTime > 0) {

                        viewCache.showProjectFullIcon.setVisibility(View.GONE);
                        viewCache.projectProgress.setVisibility(View.GONE);
                        viewCache.showTimer.setVisibility(View.VISIBLE);

                        long tempTime = vo.remainOpenTime;
                        long day = tempTime / 60 / 60 / 24;
                        long hours = (tempTime - day * 24 * 60 * 60) / 60 / 60;
                        long minutes = (tempTime - day * 24 * 60 * 60 - hours * 60 * 60) / 60;
                        long seconds = (tempTime - day * 24 * 60 * 60 - hours * 60 * 60 - minutes * 60);
                        if (minutes > 0) {
                            viewCache.timer.setText(minutes + "分" + seconds + "秒");
                        } else {
                            viewCache.timer.setText(seconds + "秒");
                        }
                    }else{
                        viewCache.showProjectFullIcon.setVisibility(View.GONE);
                        viewCache.projectProgress.setVisibility(View.VISIBLE);
                        viewCache.showTimer.setVisibility(View.GONE);
                    }

在handler中每秒钟刷新一次界面

      mHandler.sendEmptyMessageDelayed(2586221,1000);
      adapter.notifyDataSetChanged();
      //每隔1毫秒更新一次界面,如果只需要精确到秒的倒计时此处改成1000即可
      mHandler.sendEmptyMessageDelayed(2586221,1000);
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值