Android應用中ListView實現多條數據同時倒計時功能
最近在做一個網購APP,有個小功能就是限時搶購商品在限定時間內有優惠活動,我們需要給每個件商品做一個倒計時顯示告訴用戶還剩下多少時間。項目中我們有用到ListView和GridView來加載我們的商品數據,對每條數據(對應一件商品)進行倒計時。倒計時實現方式很多,常用的有以下方式:
1,采用Handle與線程的sleep(long)
2,采用Handler的postDelayed(Runnable, long)方法
3,采用Handler與timer及TimerTask結合的方法
當然還有其它的方法,雖然功能簡單,但是我在實現過程中也有一小點問題,就是開始實現了計時,但是每當上下拉刷新時,時間就會錯亂。后來經過調整,終于實現了所要的效果。下面講下我用到的實現方式,還有另外一種方式類似,只是把hander及時間 處理放到adapter中了,用的Handler+Timer+TimerTask實現的:
Activity中代碼:
public class ShopActivity extends Activity {
private ListView lv;
private ShopAdapter pmAdapter;
private Timer timer = new Timer();
private TimerTask timerTask;
private List<MyData> dataList;
@SuppressLint("HandlerLeak")
private Handler mHandler = new Handler() {
public void handleMessage(android.os.Message msg) {
if (msg.what == 1) {
for (int i = 0; i < mMyMatchList.size(); i++) {
dataList.get(i).setServerDate(Long.valueOf(dataList.get(i).getServerDate())+ 1 + "");//這是服務器當前時間,以此時間為基數進行倒時計,因為服務器時間以秒為單位返回,所以我們每隔1秒,把當前服務器時間+1,也可以把結束時間-1
serverTime = Long.valueOf(mMyMatchList.get(i).getServerDate());
pmAdapter.notifyDataSetChanged();
}
}
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.layout_shop);
dataList=new ArrayList<MyData>();//接下來要從服務端取到數據,加入dataList中
lv= (ListView) this.findViewById(R.id.shop_lv);
pmAdapter = new ShopAdapter(ShopActivity.this, this);
lv.setAdapter(pmAdapter);
timerTask = new TimerTask() {
@Override
public void run() {
Message message = Message.obtain();
message.what = 1;
mHandler.sendMessage(message);
}
};
timer.schedule(timerTask, 1000, 1000);
}
@Override
protected void onResume() {
super.onResume();
}
@Override
protected void onDestroy() {
if (null != timer) {
timer.cancel();
}
super.onDestroy();
}
}
最后在適配器類ShopAdapter中,根據服務器返回的商品優惠截止時間和服務器時間,把數據加上去就可以了:
TextView timeTv=findViewById();
timeTv.setText(getTimeFromInt(結束時間-服務器時間));
getTimeFromInt這個方法是計算時間差并轉換成所需要格式的:
public String getTimeFromInt(long time) {
if (time <= 0) { return "已結束"; }
long day = time / (1 * 60 * 60 * 24);
long hour = time / (1 * 60 * 60) % 24;
long minute = time / (1 * 60) % 60;
long second = time / (1) % 60;
return "還剩:" + day + "天" + hour + "小時" + minute + "分" + second + "秒";
}