android listview 倒计时错乱,Android_ListView实现商品倒计时(解决时间错乱问题)

话说某一天,看到app需求要求实现列表产品倒计时功能,这时候你就觉得这个简单啊,用 CountDownTimer分分钟搞定,一阵噼里啪啦,运行一看,我去,什么鬼,各种时间胡乱抖动有木有,既然是listview,为了提高效率,必然会使用 convert,那就会存在复用问题(有的人就说了,那我不复用就好啦,这确实是可以,但并不科学),时间不是重叠就是错乱,fuck

看下代码

首先有个倒计时的类,没错,就是 CountDownTimer,用过的都知道,没用过的,呵呵...接着看

public class CountDownUtil extends CountDownTimer {

private TextView tv;//

/**

*

* @param millisInFuture

* 倒计时时间

* @param countDownInterval

* 间隔

* @param tv

* 控件

*/

public CountDownUtil(long millisInFuture, long countDownInterval,

TextView tv) {

super(millisInFuture, countDownInterval);

this.tv = tv;

}

@SuppressLint("NewApi")

@Override

public void onTick(long millisUntilFinished) {

tv.setText(DateFormatUtils.getHours(millisUntilFinished));//设置时间

//这里接收的是毫秒值,当然,我们要将他格式化一下

}

@SuppressLint("NewApi")

@Override

public void onFinish() {

}

}

小case,猜对了,重点还是在adapter上,

public View getView(int position, View convertView, ViewGroup parent) {

// TODO Auto-generated method stub

Holder holder;

if (convertView == null) {

holder = new Holder();

convertView = View.inflate(MainActivity.this, R.layout.item,

null);

holder.tv_time = (TextView) convertView.findViewById(R.id.time);

convertView.setTag(holder);

} else {

holder = (Holder) convertView.getTag();

}

//获取控件对应的倒计时控件是否存在,存在就取消,解决时间重叠问题

//leftTimeMap哪来的?接着往下看

CountDownUtil tc = leftTimeMap.get(holder.tv_time);

if (tc != null) {

tc.cancel();

tc = null;

}

//实例化倒计时类

CountDownUtil cdu = new CountDownUtil(datas.get(position), 1000,

holder.tv_time);

//开启倒计时

cdu.start();

//[醒目]此处需要map集合将控件和倒计时类关联起来,就是这里

leftTimeMap.put(holder.tv_time, cdu);

return convertView;

}

//作为严谨的码工,当然要善始善终

public void cancelAllTimers() {

Set> s = leftTimeMap.entrySet();

Iterator it = s.iterator();

while (it.hasNext()) {

try {

Map.Entry pairs = (Map.Entry) it.next();

CountDownUtil cdt = (CountDownUtil) pairs.getValue();

cdt.cancel();

cdt = null;

} catch (Exception e) {

}

}

it = null;

s = null;

leftTimeMap.clear();

}

时间格式化类

/**

* @param 毫秒值

*

* @return 时:分:秒

*

*/

public static String getHours(long time) {

long second = time / 1000;

long hour = second / 60 / 60;

long minute = (second - hour * 60 * 60) / 60;

long sec = (second - hour * 60 * 60) - minute * 60;

String rHour = "";

String rMin = "";

String rSs = "";

// 时

if (hour < 10) {

rHour = "0" + hour;

} else {

rHour = hour + "";

}

// 分

if (minute < 10) {

rMin = "0" + minute;

} else {

rMin = minute + "";

}

// 秒

if (sec < 10) {

rSs = "0" + sec;

} else {

rSs = sec + "";

}

// return hour + "小时" + minute + "分钟" + sec + "秒";

return rHour + ":" + rMin + ":" + rSs;

}

最后

@Override

protected void onStop() {

// TODO Auto-generated method stub

super.onStop();

// adapter.cancelAllTimers();

if (adapter != null) {

adapter.cancelAllTimers();

}

}

差不多就是这样了,看了很多实例都不理想,在stackoverflow看到这种方案比较靠谱

如果你有更好的解决方案,希望可以一起探讨

源码下载

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值