项目中用到的两种倒计时,一种是用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);