異常信息如下:
創(chuàng)新互聯(lián)公司作為成都網(wǎng)站建設(shè)公司,專注重慶網(wǎng)站建設(shè)公司、網(wǎng)站設(shè)計(jì),有關(guān)成都定制網(wǎng)頁(yè)設(shè)計(jì)方案、改版、費(fèi)用等問(wèn)題,行業(yè)涉及成都不銹鋼雕塑等多個(gè)領(lǐng)域,已為上千家企業(yè)服務(wù),得到了客戶的尊重與認(rèn)可。
The?content?of?the?adapter?has?changed?but?ListView?did?not?receive?a?notification. Make?sure?the?content?of?your?adapter?is?not?modified?from?a?background?thread,? but?only?from?the?UI?thread.??Make?sure?your?adapter?calls?notifyDataSetChanged()?when?its?content?changes.
該異常信息翻譯過(guò)來(lái)的中文含義是:
Adapter的數(shù)據(jù)內(nèi)容已經(jīng)改變,但是ListView卻未接收到通知。要確保不在后臺(tái)線程中修改Adapter的數(shù)據(jù)內(nèi)容,而要在UI Thread中修改。
該異常產(chǎn)生的原因是:當(dāng)ListView緩存的數(shù)據(jù)Count和ListView中Adapter.getCount()不等時(shí),并且在這個(gè)時(shí)候ListView 發(fā)生了交互事件就會(huì)拋出該異常。為避免該異常,要確保Adapter的數(shù)據(jù)內(nèi)容改變時(shí)一定要調(diào)用notifyDataSetChanged()方法。
當(dāng)使用Handler+Message或AsyncTask分批次異步下載數(shù)據(jù)信息,并在UI線程中使用adapter.notifyDataSetChanged()時(shí),經(jīng)常會(huì)產(chǎn)生這種異常。
解決辦法是:保證數(shù)據(jù)內(nèi)容改變時(shí)及時(shí)調(diào)用notifyDataSetChanged()方法。要把notifydatasetchange和listview的數(shù)據(jù)源更新放在一個(gè)線程更新.但是這樣的話,listview的數(shù)據(jù)源就不能異步了,所以就在adapter上做文章.
1. adapter的構(gòu)造方法不能把listview的數(shù)據(jù)源放進(jìn)去,而是用set數(shù)據(jù)源的方式;
????2. 在自定義的adapter的getcount上面不直接返回 return imgs.size(),而是返回:return null == imgs ? 0:imgs.size();
????3. 當(dāng)需要更新UI線程時(shí),操作如下:
參考:https://www.jianshu.com/p/216b12a744a3