2011-10-27 78 views
0

使用Sectioned adapter即時通訊。每個部分都有一個「subAdapter」。當在列表視圖中更新適配器時崩潰

當我刪除所有部分並添加新部分時,出現問題。如果新的金額>舊金額的部分。

10-27 08:08:33.789: ERROR/AndroidRuntime(21550): java.lang.ArrayIndexOutOfBoundsException 
10-27 08:08:33.789: ERROR/AndroidRuntime(21550):  at android.widget.AbsListView$RecycleBin.addScrapView(AbsListView.java:5283) 
10-27 08:08:33.789: ERROR/AndroidRuntime(21550):  at android.widget.AbsListView.trackMotionScroll(AbsListView.java:4092) 
10-27 08:08:33.789: ERROR/AndroidRuntime(21550):  at android.widget.AbsListView.onTouchEvent(AbsListView.java:2523) 
10-27 08:08:33.789: ERROR/AndroidRuntime(21550):  at android.widget.ListView.onTouchEvent(ListView.java:3733) 
10-27 08:08:33.789: ERROR/AndroidRuntime(21550):  at android.view.View.dispatchTouchEvent(View.java:3885) 
10-27 08:08:33.789: ERROR/AndroidRuntime(21550):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:903) 
10-27 08:08:33.789: ERROR/AndroidRuntime(21550):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:942) 
10-27 08:08:33.789: ERROR/AndroidRuntime(21550):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:942) 
10-27 08:08:33.789: ERROR/AndroidRuntime(21550):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:942) 

從我讀過的這是一個getViewTypeCount的問題。我猜測,當我更新適配器並調用adapter.notifyDataSetChanged()時,該方法未被調用;

如果我將適配器的新實例設置爲listAdapter,則不會發生此問題。

我該如何解決這個問題?我可以強制活動回憶getViewTypeCount嗎?

+0

請添加代碼從您的適配器。 –

回答

2

我猜測當我更新適配器並調用adapter.notifyDataSetChanged()時,該方法未被調用;

正確。 getViewTypeCount()只被調用一次。

我該如何解決這個問題?

不要在適配器的生命週期中更改getViewTypeCount()的值。

我可以強制該活動調用getViewTypeCount嗎?

不是說我知道,對不起。

+0

從javadoc'只有在適配器設置在AdapterView'上時纔會調用此方法 – Blundell

0

哈克警報

如果您正在使用的Etsy的StaggerredGridView(和複製代碼作爲一個模塊),或使用extends AbsListView你能得到它召回getViewTypeCount()每當調用notifyDataSetChanged()東西。

這裏是原來的代碼(StaggeredGridView - ExtendableListView.java

@Override 
public void setAdapter(final ListAdapter adapter) { 
    // ... other code 

    if (mAdapter != null) { 
     mAdapter.registerDataSetObserver(mObserver); 
     mRecycleBin.setViewTypeCount(mAdapter.getViewTypeCount()); 
    } 

    requestLayout(); 
} 

正如你可以看到mAdapter.getViewTypeCount()當你調用setAdapter只叫 因此,如果我們複製此代碼並將其移動到的地方notifyDataSetChanged()是叫我們可以使用新類型的更新我們的適配器

這是在這裏(用於StaggeredGridView - ExtendableListView.java

class AdapterDataSetObserver extends DataSetObserver { 

     private Parcelable mInstanceState = null; 

     @Override 
     public void onChanged() { 
      // other code 

      mRecycleBin.clearTransientStateViews(); 
      mRecycleBin.setViewTypeCount(mAdapter.getViewTypeCount()); // ADD THIS 

      // other code 
      requestLayout(); 
     } 

     // more methods 
    } 

我不知道這是否會影響性能或回收,通過閱讀本文,您將承擔上述代碼的所有責任。 :-)