Android 倒计时功能

最近项目需要加一个倒计时功能,大致效果为:
这里写图片描述

如果天数为零需要显示 3时35分57秒,以此类推;

还需要在listview条目中显示倒计时功能,条目中有个圆形的区域
这里写图片描述

对于第一种效果由于只显示一个,可以直接用CountDownTimer来完成,代码如下:

 private Button btnInvest;
 private TimeCount timeLast;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        //开始倒计时,倒计时数据应该从网络获取
        timeLast = new TimeCount(Long.valueOf("10000"), 1000);
        timeLast.start();
    }


    @Override
    public void onResume() {
        super.onResume();
//判断是否开始倒计时,如果开始倒计时则取消,主要是为了和网络数据统一
       if(timeLast != null){
         timeLast.cancel();
       }
       //开始倒计时,此处的倒计时数据应该从网络获取
      timeLast = new TimeCount(Long.valueOf("1000"), 1000);
       timeLast.start();
}

  class TimeCount extends CountDownTimer {

        public TimeCount(long millisInFuture, long countDownInterval) {
            super(millisInFuture, countDownInterval);//参数依次为总时长,和计时的时间间隔
        }
        @Override
        public void onFinish() {//计时完毕时触发  
            btnInvest.setBackgroundDrawable(currFragAct.getResources().getDrawable(R.mipmap.btn_blue_home));
                btnInvest.setText("倒计时结束");
        }

        @Override
        public void onTick(long millisUntilFinished) {//计时过程显示
                long day = millisUntilFinished /1000/60/60/24;
                long hours = (millisUntilFinished - day*24*60*60*1000)/1000/60/60;
                long minutes = (millisUntilFinished -  day*24*60*60*1000 - hours*1000*60*60)/1000/60;
                long seconds = (millisUntilFinished -  day*24*60*60*1000 - hours*1000*60*60 - minutes*1000*60)/1000;
                if(day > 0){
                    btnInvest.setText("剩余"+day+"天"+hours+"时"+minutes+"分"+seconds+"秒");
                }else if(hours > 0){
                    btnInvest.setText("剩余"+hours+"时"+minutes+"分"+seconds+"秒");
                }else if(minutes > 0){
                    btnInvest.setText("剩余"+minutes+"分"+seconds+"秒");
                }else{
                    btnInvest.setText("剩余"+seconds+"秒");
                }
        }
    }

但是对于listview条目的倒计时,用上面的方法就不行了,会出现错乱,简单来说就是复用的textview都会出现倒计时,最后使用了handler来解决,代码如下:

private Handler handler;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        handler = new Handler(){

            @Override
            public void handleMessage(Message msg) {
                if (msg.what ==1024) {
                    investAdapter.notifyDataSetChanged();
                    //每隔1秒更新一次界面
                    handler.sendEmptyMessageDelayed(1024,1000);
                }
            }
        };
    }

public class InvestAdapter extends MyBaseAdapter{
   public List<LoanVo> list;

        //省略好多代码。。。。

    @Override
    public View getView(final int i, View view, ViewGroup viewGroup) {

        //这里其他没用的代码我就不贴了
LoanVo data =list.get(i);
if(data.getTimeCount() != null && data.getTimeCount().length() > 0){
    if(Long.valueOf(data.getTimeCount()) != 0){
       long tempTime =Long.valueOf(data.getTimeCount());
       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(day > 0){
           investFlag.setText("倒计时\n"+day+"天"+hours+"时");
         }else if(hours > 0){             
         investFlag.setText("倒计时\n"+hours+"时"+minutes+"分");
          }else if(minutes > 0){
           investFlag.setText("倒计时\n"+minutes+"分"+seconds+"秒");
          }else{
           investFlag.setText("倒计时\n"+seconds+"秒");
            }
        }else{
          data.showClock = 0;
        }
 }
 }
    private Thread thread;

    public void start() {
        thread = new Thread() {
            public void run() {
                while (true) {
                    try {
                        sleep(1000);
                        if (list != null) {
                            for (LoanVo item : list) {
                                if(item.getTimeCount() != null && item.getTimeCount().length() > 0){
                                    //item.timeCount = item.timeCount - 1;
                                    if(Long.valueOf(item.getTimeCount()) == 0){
                                        item.setTimeCount("0");
                                    }else{
                                        item.setTimeCount((Long.valueOf(item.getTimeCount()) - 1) + "");
                                    }

                                }
                            }
                        }
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        };
        thread.start();
}

代码大致就是这个样子

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值