Android利用RecyclerView实现列表倒计时功能,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。

创新互联-专业网站定制、快速模板网站建设、高性价比锡林郭勒盟网站开发、企业建站全套包干低至880元,成熟完善的模板库,直接使用。一站式锡林郭勒盟网站制作公司更省心,省钱,快速模板网站建设找我们,业务覆盖锡林郭勒盟地区。费用合理售后完善,十年实体公司更值得信赖。
实现思路
实现方法主要有两个: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;
倒计时
Timer
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); } } } }
线程交互更新item
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 )方法:
@Override public void onBindViewHolder(@NonNull Holder holder, int position, @NonNull List