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<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看到这种方案比较靠谱

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


源码下载

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值