最近项目需要加一个倒计时功能,大致效果为:
如果天数为零需要显示 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();
}
代码大致就是这个样子