Android應用中ListView實現多條數據同時倒計時功能

fydxdk 9年前發布 | 31K 次閱讀 Android Android開發 移動開發

     最近在做一個網購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 + "秒";
}

 本文由用戶 fydxdk 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!