Android 倒计时功能

来源:互联网 发布:黄金比例算法 编辑:程序博客网 时间:2024/04/30 12:36

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

如果天数为零需要显示 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 0