Android 倒計時功能

最近項目需要加一個倒計時功能,大致效果爲:
這裏寫圖片描述

如果天數爲零需要顯示 3時35分57秒,以此類推;

還需要在listview條目中顯示倒計時功能,條目中有個圓形的區域
這裏寫圖片描述

對於第一種效果由於只顯示一個,可以直接用CountDownTimer來完成,代碼如下:

 private Button btnInvest;
 private TimeCount timeLast;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        //開始倒計時,倒計時數據應該從網絡獲取
        timeLast = new TimeCount(Long.valueOf("10000"), 1000);
        timeLast.start();
    }


    @Override
    public void onResume() {
        super.onResume();
//判斷是否開始倒計時,如果開始倒計時則取消,主要是爲了和網絡數據統一
       if(timeLast != null){
         timeLast.cancel();
       }
       //開始倒計時,此處的倒計時數據應該從網絡獲取
      timeLast = new TimeCount(Long.valueOf("1000"), 1000);
       timeLast.start();
}

  class TimeCount extends CountDownTimer {

        public TimeCount(long millisInFuture, long countDownInterval) {
            super(millisInFuture, countDownInterval);//參數依次爲總時長,和計時的時間間隔
        }
        @Override
        public void onFinish() {//計時完畢時觸發  
            btnInvest.setBackgroundDrawable(currFragAct.getResources().getDrawable(R.mipmap.btn_blue_home));
                btnInvest.setText("倒計時結束");
        }

        @Override
        public void onTick(long millisUntilFinished) {//計時過程顯示
                long day = millisUntilFinished /1000/60/60/24;
                long hours = (millisUntilFinished - day*24*60*60*1000)/1000/60/60;
                long minutes = (millisUntilFinished -  day*24*60*60*1000 - hours*1000*60*60)/1000/60;
                long seconds = (millisUntilFinished -  day*24*60*60*1000 - hours*1000*60*60 - minutes*1000*60)/1000;
                if(day > 0){
                    btnInvest.setText("剩餘"+day+"天"+hours+"時"+minutes+"分"+seconds+"秒");
                }else if(hours > 0){
                    btnInvest.setText("剩餘"+hours+"時"+minutes+"分"+seconds+"秒");
                }else if(minutes > 0){
                    btnInvest.setText("剩餘"+minutes+"分"+seconds+"秒");
                }else{
                    btnInvest.setText("剩餘"+seconds+"秒");
                }
        }
    }

但是對於listview條目的倒計時,用上面的方法就不行了,會出現錯亂,簡單來說就是複用的textview都會出現倒計時,最後使用了handler來解決,代碼如下:

private Handler handler;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        handler = new Handler(){

            @Override
            public void handleMessage(Message msg) {
                if (msg.what ==1024) {
                    investAdapter.notifyDataSetChanged();
                    //每隔1秒更新一次界面
                    handler.sendEmptyMessageDelayed(1024,1000);
                }
            }
        };
    }

public class InvestAdapter extends MyBaseAdapter{
   public List<LoanVo> list;

        //省略好多代碼。。。。

    @Override
    public View getView(final int i, View view, ViewGroup viewGroup) {

        //這裏其他沒用的代碼我就不貼了
LoanVo data =list.get(i);
if(data.getTimeCount() != null && data.getTimeCount().length() > 0){
    if(Long.valueOf(data.getTimeCount()) != 0){
       long tempTime =Long.valueOf(data.getTimeCount());
       long day = tempTime /60/60/24;
       long hours = (tempTime - day*24*60*60)/60/60;
       long minutes = (tempTime -  day*24*60*60 - hours*60*60)/60;
       long seconds = (tempTime -  day*24*60*60 - hours*60*60 - minutes*60);
        if(day > 0){
           investFlag.setText("倒計時\n"+day+"天"+hours+"時");
         }else if(hours > 0){             
         investFlag.setText("倒計時\n"+hours+"時"+minutes+"分");
          }else if(minutes > 0){
           investFlag.setText("倒計時\n"+minutes+"分"+seconds+"秒");
          }else{
           investFlag.setText("倒計時\n"+seconds+"秒");
            }
        }else{
          data.showClock = 0;
        }
 }
 }
    private Thread thread;

    public void start() {
        thread = new Thread() {
            public void run() {
                while (true) {
                    try {
                        sleep(1000);
                        if (list != null) {
                            for (LoanVo item : list) {
                                if(item.getTimeCount() != null && item.getTimeCount().length() > 0){
                                    //item.timeCount = item.timeCount - 1;
                                    if(Long.valueOf(item.getTimeCount()) == 0){
                                        item.setTimeCount("0");
                                    }else{
                                        item.setTimeCount((Long.valueOf(item.getTimeCount()) - 1) + "");
                                    }

                                }
                            }
                        }
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        };
        thread.start();
}

代碼大致就是這個樣子

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章