话说某一天,看到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<Entry<TextView, CountDownUtil>> 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;
}
最后
<pre code_snippet_id="1573563" snippet_file_name="blog_20160203_4_1945513" name="code" class="java">@Override
protected void onStop() {
// TODO Auto-generated method stub
super.onStop();
// adapter.cancelAllTimers();
if (adapter != null) {
adapter.cancelAllTimers();
}
}
差不多就是这样了,看了很多实例都不理想,在stackoverflow看到这种方案比较靠谱
如果你有更好的解决方案,希望可以一起探讨