2011-10-27 5 views
0

Im 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()は1回だけ呼び出されます。

どうすればこの問題を解決できますか?

getViewTypeCount()の値をアダプタの有効期間中は変更しないでください。

強制的にgetViewTypeCountを呼び出すことはできますか?

ご存知のことですが、申し訳ありません。

+0

javadocから 'このメソッドはアダプタがAdapterViewで設定されている場合にのみ呼び出されます。 – Blundell

0

ハックアラート

あなたがetsyのStaggerredGridView(およびモジュールなどのコードをコピーして)、またはあなたがnotifyDataSetChanged()を呼び出すたび、それはgetViewTypeCount()を思い出してもらうことができますextends AbsListViewものを使用するを使用している場合。ここで

StaggeredGridViewため、元のコード(ある - ExtendableListView.java:あなたがsetAdapterを呼び出すときmAdapter.getViewTypeCount()だけ呼ばれる見ることができるように

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

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

    requestLayout(); 
} 

私たちは、このコードをコピーし、場所notifyDataSetChanged()に移動あればあります私たちは新しいタイプで、当社のアダプタを更新することができますと呼ばれるここ(StaggeredGridViewです

からExtendableListView.java:!

これが性能やリサイクルに影響を与えるかどうかはわかりませんが、これを読んで上記のコードに全責任を負います。 :-)

関連する問題