listView天小时分钟秒倒计时的实现

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();  
        }  
      }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值