最近面試時,面試官問了一個列表倒計時效果如何實現,然后腦袋突然懵的了O(∩_∩)O,現在記錄一下。
運行效果圖

實現思路
實現方法主要有兩個:
1.為每個開始倒計時的item啟動一個定時器,再做更新item處理;
2.只啟動一個定時器,然后遍歷數據,再做再做更新item處理。
經過思考,包括性能、實現等方面,決定使用第2種方式實現。
實現過程
/**
* 總共的倒計時的時間(結束時間-開始時間),單位:毫秒
* 例: 2019-02-23 11:00:30 與 2019-02-23 11:00:00 之間的相差的毫秒數
*/
private long totalTime;
/**
* 倒計時是否在暫停狀態
*/
private boolean isPause = true;
mTimer.schedule(mTask, 0, 1000);
TimerTask
class MyTask extends TimerTask {
@Override
public void run() {
if (mList.isEmpty()) {
return;
}
int size = mList.size();
CountDownTimerBean bean;
long totalTime;
for (int i = 0; i < size; i++) {
bean = mList.get(i);
if (!bean.isPause()) {//不處於暫停狀態
totalTime = bean.getTotalTime() - 1000;
if (totalTime <= 0) {
bean.setPause(true);
bean.setTotalTime(0);
}
bean.setTotalTime(totalTime);
Message message = mHandler.obtainMessage(1);
message.arg1 = i;
mHandler.sendMessage(message);
}
}
}
}
mHandler = new Handler(Looper.getMainLooper()) {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case 1:
notifyItemChanged(msg.arg1, "update-time");
break;
}
}
};
- 性能優化方面
1.調用notifyItemChanged()方法后,不要更新整個item(比如說item包含圖片,不需要變的),所以要重寫onBindViewHolder( Holder , int , List