Android_ListView实现商品倒计时(解决时间错乱问题)
看到app需求要求实现列表产品倒计时功能,这时候你就觉得这个简单啊,用 CountDownTimer分分钟搞定,一阵噼里啪啦,运行一看,我去,什么鬼,各种时间胡乱抖动有木有,既然是listview,为了提高效率,必然会使用 convert,那就会存在复用问题(有的人就说了,那我不复用就好啦,这确实是可以,但并不科学),时间不是重叠就是错乱,fuck
看下代码
首先有个倒计时的类,没错,就是 CountDownTimer ,用过的都知道,没用过的,呵呵...接着看
class MyCount extends CountDownTimer {
/**
* MyCount的构造方法
*
* @param millisInFuture
* 要倒计时的时间
* @param countDownInterval
* 时间间隔
*/
TextView textview;
public MyCount(long millisInFuture, long countDownInterval,TextView textview) {
super(millisInFuture, countDownInterval);
this.textview = textview;
}
@Override
public void onTick(long millisUntilFinished) {// 在进行倒计时的时候执行的操作
long day = millisUntilFinished / (1000 * 60 * 60 * 24);
long hour = (millisUntilFinished % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60);
long minute = (millisUntilFinished % (1000 * 60 * 60)) / (1000 * 60);
long second = (millisUntilFinished % (1000 * 60)) / 1000;
computeTime(day,hour,minute,second);
textview.setText(day+"天"+hour+"时"+minute+"分"+second+"秒");
textview.setEnabled(false);
}
@Override
public void onFinish() {// 倒计时结束后要做的事情
textview.setText(R.string.customer_send_center);
textview.setEnabled(true);
textview.setClickable(true);
}
}
2.倒计时计算方法
/**
* 倒计时计算
*/
private void computeTime(long day ,long mHour,long mMin,long mSecond) {
mSecond--;
if (mSecond < 0) {
mMin--;
mSecond = 59;
if (mMin < 0) {
mMin = 59;
mHour--;
if (mHour < 0) {
// 倒计时结束
mHour = 23;
day--;
}
}
}
}
3.重点还是在adapter上
private Map<TextView,Object> leftTimeMap = new HashMap<TextView,Object>();
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
View row = convertView;
ViewHolder viewHolder = null;
final CustomerInfo customerListInfo = list.get(position);
if (row == null) {
row = myInflater.inflate(R.layout.customer_list_item, null);
viewHolder = new ViewHolder();
viewHolder. item_img= (ImageView) row.findViewById(R.id.item_img);
viewHolder.item_name = (TextView) row.findViewById(R.id.item_name);
viewHolder. item_deal_order= (TextView) row.findViewById(R.id.item_deal_order);
viewHolder. item_cancel_order= (TextView) row.findViewById(R.id.item_cancel_order);
viewHolder. item_area= (TextView) row.findViewById(R.id.item_area);
viewHolder. item_return_order= (TextView) row.findViewById(R.id.item_return_order);
viewHolder. item_last_order_time= (TextView) row.findViewById(R.id.item_last_order_time);
viewHolder. item_last_order_price= (TextView) row.findViewById(R.id.item_last_order_price);
// viewHolder. item_send_center= (Button) row.findViewById(R.id.item_send_center);
viewHolder. item_look_order= (Button) row.findViewById(R.id.item_look_order);
viewHolder. item_tel= (Button) row.findViewById(R.id.item_tel);
viewHolder. item_send_center= (LinearLayout) row.findViewById(R.id.item_send_center);
viewHolder. item_send_center_tv= (TextView) row.findViewById(R.id.item_send_center_tv);
row.setTag(viewHolder);
} else {
viewHolder = (ViewHolder) row.getTag();
}
ImageLoader.getInstance().displayImage(Constants.URL_IMG_GET+customerListInfo.getImg_header(), viewHolder.item_img,MyApplication.optionsHeader);
viewHolder.item_name.setText(customerListInfo.getTer_name());
viewHolder. item_deal_order.setText(mActivity.getResources().getString(R.string.deal_order,customerListInfo.getO_num()));
viewHolder. item_area.setText(customerListInfo.getTer_address());
viewHolder. item_last_order_time.setText(mActivity.getResources().getString(R.string.last_order_time,customerListInfo.getL_date()));
viewHolder. item_last_order_price.setText(mActivity.getResources().getString(R.string.last_order_price,customerListInfo.getFee()));
viewHolder. item_send_center_tv.setText(mActivity.getResources().getString(R.string.send_center,customerListInfo.getLast_send()));
viewHolder. item_cancel_order.setText("取消1单");
viewHolder. item_return_order.setText("退货3单");
viewHolder. item_cancel_order.setVisibility(View.GONE);
viewHolder. item_return_order.setVisibility(View.GONE);
viewHolder.item_tel.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View v) {
PublicUtil.callPhone(mActivity,customerListInfo.getTer_phone());
}
});
//获取控件对应的倒计时控件是否存在,存在就取消,解决时间重叠问题
MyCount tc = (MyCount) leftTimeMap.get(viewHolder.item_send_center_tv);
if (tc != null) {
tc.cancel();
tc = null;
}
long time = DataUtils.dataMillis(String.valueOf(list.get(position).getLast_send()), DataUtils.dateToString(new Date()));
if((1000*60*60*48-time) < 1000*60*60*48){
Log.e("time", time+"");
Log.e("当前时间",DataUtils.dateToString(new Date()));
Log.e("上一次发送心跳时间",String.valueOf(list.get(position).getLast_send()));
myCount = new MyCount(1000*60*60*48-time, 1000,viewHolder.item_send_center_tv);
myCount.start();
//[醒目]此处需要map集合将控件和倒计时类关联起来,就是这里
leftTimeMap.put(viewHolder.item_send_center_tv, myCount);
viewHolder.item_send_center_tv.setClickable(false);
}else{
viewHolder.item_send_center_tv.setText(R.string.customer_send_center);
viewHolder.item_send_center_tv.setEnabled(true);
viewHolder.item_send_center_tv.setClickable(true);
}
viewHolder.item_send_center_tv.setOnClickListener(new DownClickListener(viewHolder,position));
viewHolder.item_look_order.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View v) {
Intent intent = new Intent();
intent.putExtra("customerId", customerListInfo.getId());
intent.putExtra("customerName", customerListInfo.getTer_name());
intent.setClass(mActivity, CustomerDetailsActivity.class);
mActivity.startActivity(intent);
}
});
row.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View v) {
Intent intent = new Intent();
intent.putExtra("customerId", customerListInfo.getId());
intent.putExtra("customerName",customerListInfo.getTer_name());
intent.setClass(mActivity, CustomerDetailsActivity.class);
mActivity.startActivity(intent);
}
});
return row;
}
class ViewHolder {
ImageView item_img;
TextView item_name;
TextView item_deal_order;
TextView item_cancel_order;
TextView item_area;
TextView item_return_order;
TextView item_last_order_time;
TextView item_last_order_price;
LinearLayout item_send_center;
TextView item_send_center_tv;
Button item_look_order;
Button item_tel;
}
// 设置监听的方法
class DownClickListener implements View.OnClickListener {
ViewHolder viewHolder;
int position;
public DownClickListener(ViewHolder viewHolder, int position) {
this.viewHolder = viewHolder;
this.position = position;
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.item_send_center_tv:
PublicRequest.sendCare(mSVProgressHUD,userStoreId,list.get(position).getId(),mHandler);
long time = DataUtils.dataMillis(String.valueOf(list.get(position).getLast_send()), DataUtils.dateToString(new Date()));
Log.e("time", time+"");
Log.e("当前时间",DataUtils.dateToString(new Date()));
Log.e("上一次发送心跳时间",String.valueOf(list.get(position).getLast_send()));
myCount = new MyCount(1000*60*60*48, 1000,viewHolder.item_send_center_tv);
myCount.start();
viewHolder.item_send_center_tv.setClickable(false);
break;
default:
break;
}
}
}
//作为严谨的码工,当然要善始善终,加上下面的代码
public void cancelAllTimers() {
Set<Entry<TextView, Object>> s = leftTimeMap.entrySet();
Iterator it = s.iterator();
while (it.hasNext()) {
try {
Map.Entry pairs = (Map.Entry) it.next();
MyCount cdt = (MyCount) pairs.getValue();
cdt.cancel();
cdt = null;
} catch (Exception e) {
}
}
it = null;
s = null;
leftTimeMap.clear();
}
最后 在对应的Activity或者Fragment加上下面的代码
@Override
public void onStop() {
// TODO Auto-generated method stub
super.onStop();
// adapter.cancelAllTimers();
if (customerListAdapter != null) {
customerListAdapter.cancelAllTimers();
}
}