Recyclerview里的倒计时控件与其ViewHolder机制的兼容

众所周知RecyclerView中是使用ViewHolder来优化内存的,而如果在RecyclerView中使用倒计时控件的话,在来回滑动的时候你就会发现倒计时控件被重置了时间~

这~还倒计时个锤子哦。

下面提供一种利用客户端时间差的思路解决这个问题。

场景分析

倒计时控件的时间是取于服务器的,为什么不取客户端时间?

因为客户端时间你无法保证他是正确的,很经常有用户手机时间错乱,少则几分钟大则几年都有可能,而且倒计时控件的时间一般要求都是精确到秒级,甚至一些电商app的秒杀是精确到毫秒级的,取客户端本地时间的话。。。。

那么为了配合RecyclerView的复用机制,你总不成在它每次复用的时候来请求一下服务器拿最新时间吧,那样的话滑上滑下就是几次网络请求,也是恐怖。

或者你不使用复用机制,RecyclerView展示的内容不是很多,还是勉强可以接受,但这样做一点都不优雅。

所以要利用客户端的时间差来弥补,并且兼容复用机制。

记录从服务器返回的时间

一般来说不可能在Adapter里面来做网络请求,所以在别的地方做网络请求的时候,比如presenter里面,那么请求获取到数据的时候把时间记录下来:

1
2
3
4
5
private long refreshTime = 0;

//假设这里做了网络请求并且返回数据准备刷新列表的内容
refreshTime = = System.currentTimeMillis();
//更新view

那么把时间记录下来了怎么使用?

初始化时间使用时间差

倒计时控件在设置的时候使用时间差就可以解决时间重置问题,比如下面是adapter里面进行倒计时控件的初始化代码:

1
2
long timeStartFromServer = entity.getNowTime();//当前从服务器请求拿回来的时间
long trueNowTime = timeStartFromServer + (System.currentTimeMillis() - refreshTime);

一种简单的思路解决问题,做个记录。

文章作者: Kevin Wu
文章链接: https://kevinwu.cn/p/57cea3eb/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 KevinWu.CN
支付宝打赏