진저브레드 이하에서 Header view와 Footer view를 사용할 경우 아래처럼
IndexOutOfBoundsException이 발생하는 경우가 생긴다..
E/AndroidRuntime(11497): FATAL EXCEPTION: main
E/AndroidRuntime(11497): java.lang.IndexOutOfBoundsException: Invalid index 1, size is 1
E/AndroidRuntime(11497): at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:257)
E/AndroidRuntime(11497): at java.util.ArrayList.get(ArrayList.java:311)
E/AndroidRuntime(11497): at android.widget.HeaderViewListAdapter.isEnabled(HeaderViewListAdapter.java:164)
E/AndroidRuntime(11497): at android.widget.ListView.dispatchDraw(ListView.java:3062)
E/AndroidRuntime(11497): at android.widget.ExpandableListView.dispatchDraw(ExpandableListView.java:233)
E/AndroidRuntime(11497): at android.view.View.draw(View.java:7093)
E/AndroidRuntime(11497): at android.widget.AbsListView.draw(AbsListView.java:2699)
E/AndroidRuntime(11497): at android.view.ViewGroup.drawChild(ViewGroup.java:1739)
E/AndroidRuntime(11497): at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1466)
E/AndroidRuntime(11497): at android.view.ViewGroup.drawChild(ViewGroup.java:1737)
E/AndroidRuntime(11497): at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1466)
E/AndroidRuntime(11497): at android.view.View.draw(View.java:6989)
...
발생 원인은
어댑터가 가지고 있는 아이템의 갯수가 줄어들었을 때,
HeaderView와 FooterView를 핸들링 하기 위해 안드로이드 내부적으로 가지고 있는 HeaderViewListAdapter 의 count가 같이 변경되지 못해 발생하는 것으로
안드로이드 프레임 웍에서 onDraw 호출 시 HeaderViewListAdapter의 getCount()를 호출하여 아직 갱신되지 않은 아이템 갯수를 받아가기 때문에 발생한다.
따라서 아이템의 갯수가 변경되면 그 즉시 notifyDataSetChanged()를 호출하여 HeaderViewListAdapter의 getCount()를 갱신해 주면 해결이 가능하다.
...젠장.. 어렵구만...
감사합니다. (__)
답글삭제