最近項目需要加一個倒計時功能,大致效果爲:
如果天數爲零需要顯示 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();
}
代碼大致就是這個樣子