recyclerView列表使用Timer定时器复用错乱的问题

来源:互联网 发布:php看什么书 编辑:程序博客网 时间:2024/06/09 22:14

相信许多小哥哥,小姐姐都遇到过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;
        }
    }



原创粉丝点击