2012-08-27 15 views
5

我有共同的問題:Android的猴子導致適配器通知例外android.widget.HeaderViewListAdapter

java.lang.IllegalStateException: The content of the adapter has changed but List 
View did not receive a notification. Make sure the content of your adapter is no 
t modified from a background thread, but only from the UI thread. [in ListView(2 
131427573, class android.widget.ListView) with Adapter(class android.widget.Head 
erViewListAdapter)] 

但適配器是不是我的代碼,但在android.widget.HeaderViewListAdapter 這是使用傑利貝恩。

我通過HeaderViewListAdapter,ListAdapterListView的源代碼讀取。當ListView中的物品計數不等於ListAdapter提供的計數時,將引發IllegalStateException。在這種情況下,ListAdapterHeaderViewListAdapterHeaderViewListAdapter s計數是客戶端代碼傳遞的原始ListAdapter的計數,再加上頁眉和頁腳的大小。

我追溯了我的代碼。所有對ListView的訪問都在UI線程上,並且後面總是後跟notifyDataSetChanged()。我正在使用一個頁腳。

這在正常使用情況下不會發生。是因爲猴子嗎?但是猴子怎麼能從其他線程修改我的變量呢?

  • 更新後更猴子測試

我通過刪除調用addFooterView()刪除頁腳。猴子不再觸發異常。我應該在某個時候刪除對addFooterView()的呼叫嗎?

+0

請告訴我你找到了解決方案! – StErMi

+0

我有同樣的問題,但它也發生在猴子用法之外。我無法重現這個問題,並且猴子在20K次迭代後沒有錯誤地完成了很多次。 – StErMi

+0

對不起,我沒有找到解決方案。但是,我沒有看到猴子使用以外的這個問題。 – mparaz

回答

9

你可以嘗試添加像這樣到你的ListView:

@Override 
protected void layoutChildren() { 
    try { 
     super.layoutChildren(); 
    } catch (IllegalStateException e) { 
     ZLog.e(LOG, "This is not realy dangerous problem"); 
    } 
} 

如果添加headerview或footerview ListView,並且在notifyDataSetChanged()時它會將mItemCount更改爲實際適配器的項目計數,但右側將返回添加了headercount和footercount的僞itemcount。

http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/4.1.1_r1/android/widget/ListView.java?av=f#1538

+0

謝謝。我停止了這個項目的工作(因爲這是半年前)。 你認爲沒有副作用,只是忽略這個異常? – mparaz

+0

在我看來,這是Android的bug,所以沒有。 –

1

我會解釋我的實際問題。 如果需要,我還會附上一些代碼。

這種情況是這樣的:我創建了一個將列表附加到OnScrollListener的EndlessList。當我到達列表的末尾時,我開始一個AsyncTask(如果有數據要加載)。

在preExecute中,我將腳註添加到視圖(微調框)中。在doInBackground中,我從互聯網獲取數據,並在onPostExecute中將數據添加到適配器,然後刪除頁腳視圖(加載微調器)。您必須將其刪除,因爲您無法訪問該視圖並將其放在GONE上。

在我的代碼我從來沒有因爲適配器(ArrayAdapter,我已經從JB源代碼克隆),當你做了它的addAll自動做

/** 
* Adds the specified Collection at the end of the array. 
* 
* @param collection The Collection to add at the end of the array. 
*/ 
public void addAll(Collection<? extends T> collection) { 
    synchronized (mLock) { 
     if (mOriginalValues != null) { 
      mOriginalValues.addAll(collection); 
     } else { 
      mObjects.addAll(collection); 
     } 
    } 
    if (mNotifyOnChange) notifyDataSetChanged(); 
} 

它運作良好,但有時做notifyDataSetChange它與這個該死的錯誤崩潰,我已經不知道去解決它:

java.lang.IllegalStateException: 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. [in ListView(16908298, class android.widget.ListView) with Adapter(class android.widget.HeaderViewListAdapter)] 
    at android.widget.ListView.layoutChildren(ListView.java:1545) 
    at android.widget.AbsListView.onTouchModeChanged(AbsListView.java:2239) 
    at android.view.ViewTreeObserver.dispatchOnTouchModeChanged(ViewTreeObserver.java:591) 
    at android.view.ViewRoot.ensureTouchModeLocally(ViewRoot.java:2122) 
    at android.view.ViewRoot.ensureTouchMode(ViewRoot.java:2106) 
    at android.view.ViewRoot.deliverPointerEvent(ViewRoot.java:2216) 
    at android.view.ViewRoot.handleMessage(ViewRoot.java:1886) 
    at android.os.Handler.dispatchMessage(Handler.java:99) 
    at android.os.Looper.loop(Looper.java:130) 
    at android.app.ActivityThread.main(ActivityThread.java:3687) 
    at java.lang.reflect.Method.invokeNative(Native Method) 
    at java.lang.reflect.Method.invoke(Method.java:507) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:867) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:625) 
    at dalvik.system.NativeStart.main(Native Method) 
+0

您是否找到了解決方案? – Michael

+0

nope,我正在等待來自Android團隊的正式答案:) – StErMi

+0

仔細檢查你是否修改了UI線程中的列表數據,如果沒有,它會崩潰。 – Michael

1

我知道它一晚的答覆....但我剛剛得到這個錯誤最近....我用android-amazing-listview。而我得到同樣的錯誤與我工作

(class android.widget.HeaderViewListAdapter)]). 

解決方案是 - 結束>

我覺得這個問題從這樣一個事實getAdapter被返回AmazingAdapter而不是包裹HeaderListViewAdapter造成計數有時會出現差異。我只是從AmazingListView中刪除了getAdapter方法,並沒有得到例外。

+0

感謝分享。我不再在Android上工作......而且他們似乎還沒有解決這個問題! – mparaz

+0

我提到的解決方案爲我固定它..所以我想分享它...謝謝。 –