recyclerView列表使用Timer定时器复用错乱的问题
相信许多小哥哥,小姐姐都遇到过recycleview列表复用错乱的问题,尤其是l列表中用到Timer定时器的时候,更容易出问题。
看下图:(只截取了列表的部分)
分析列表错乱的原因:
每一个item都有一个距开赛时间的倒计时(这个是用Timer自定义的),当item滑出界面的时候,timer 还在执行,没有停止,然后下个item复用了上个item的view,
但是注意了,timer还在执行,因为复用,操作的是当前item 的view。 即出现了item的复用问题。
那如何解决呢?
当然是在item滑出屏幕的时候,把对应的timer给取消了即可。
看Recycleview.Adapter的源码,有一个方法onViewRecycled()
大概意思是,当视图被回收的时候调用。
所以我们只需要重写此方法,
从holder里面取出Timer。然后取消Timer,再把Timer置NULL(置NULL原因:快速滑动时,会产生大量Timer对象,为了内存优化,所以这里置NULL)。
其他的逻辑就好操作了。
@Override
public void onViewRecycled(RecyclerView.ViewHolder holder) {
super.onViewRecycled(holder);
MyViewHolder mHolder = (MyViewHolder) holder;
Timer timer = (Timer) mHolder.scoreMinute.getTag();
if (timer != null) {
timer.cancel();
timer=null;
}
}