最近项目中一个播放的列表,有上下切换功能。测试频繁切换更换刷新数据时,报出以下错误:
java.lang.IllegalArgumentException
Scrapped or attached views may not be recycled. isScrap:false isAttached:true
这个错误查了下,网上没有看到大神给出很给力的解答,stackoverflow上资料多一些,也是没怎么看明白。而且发生的情况还不一样。
大概的问题就是频繁切换数据。我项目里在刷新的时候,会调用adapter.clear();清楚数据后再设置上去。而这个设置过程是说直接从一个空view突然到满屏的一个数据填充过程发生了错误。但是英文直译过来明显是说view有可能不被回收问题,不知道两者存在什么联系
这个问题没明白为什么会出现,因为切换数据源时,慢慢切换,不会出现这种问题。测试那手速我不想描述。
后来问了一哥们,说遇到同样的问题。解决了,然后我特意去找让他私下问了问,也没给我解释原因,说让我去看源码。不知道原因去看源码,这种情况就进入了懵逼状态。
他给出的解决办法如下:
我程序中原来的刷新逻辑是,adapter.clear() 然后adapter.addAll(list); 完事了,正常情况下确实也没问题。然后那哥们就说加上adapter.notifyDataSetChanged();这句试试。没其他辙加上了,让测试随便手速去切换数据,嗯,解决了。虽然不知道为什么。。。。(不是一个纯技术 人啊,没搞懂原因其实)。
正常adapter.addAll(list)这句其实添加数据,是有刷新机制的,进去看了下源码不是整个列表notify的。所以猜测是不是更换所有数据,是要科学的去notify一次?
所以这个错误,在加上
adapter.notifyDataSetChanged()
这句后,我这是没问题了。如果有朋友也遇到这个问题,实在找不出办法,加上这句试试。
如果有大神遇到这个问题,并且知道具体原因,以及科学的有理有据的解决办法,希望分享出来让大家能沾沾光
要是有冠希哥的外文水平+撩妹水平多好啊,以上~~~
网友评论