5

Trong Activity của tôi, tôi thay đổi dữ liệu cơ bản HashMap cho ExpandableListView của tôi, và sau đó gọiExpandableListView getChildrenCount không được gọi sau khi dữ liệu thay đổi, dẫn đến IndexOutOfBoundsException

((BaseAdapter) myExpandableListView.getAdapter()).notifyDataSetChanged(); 

Tuy nhiên, treo ứng dụng sau khi gọi này, nâng cao một IndexOutOfBoundsException .

Tôi đã kiểm tra kỹ xem tôi có truy cập cùng dữ liệu giống nhau và đúng ở mọi nơi trong bộ điều hợp không, nhưng không tìm thấy lỗi nào.

Trả lời

6

Sau một chút gỡ lỗi, cuối cùng tôi đã phát hiện ra rằng, đủ kỳ lạ, getChildrenCount không bao giờ được gọi sau khi tôi gọi là notifyDataSetChanged. Do đó, Adapter vẫn đang mong đợi để có được cùng một số lượng trẻ em như trước khi cập nhật. Như tôi đã loại bỏ một số trẻ em, đó là một giả định sai lầm, và dẫn đến IndexOutOfBoundsException.

Sau khi chơi một chút, tôi phát hiện ra rằng đối với ExpandableListViews, Bộ điều hợp phải được truy cập qua getExpandableListAdapter(), không qua getAdapter(). Sau khi thay đổi mã của tôi thành

((BaseExpandableListAdapter) myExpandableListView.getExpandableListAdapter()).notifyDataSetChanged(); 

Mọi thứ hoạt động tốt ngay bây giờ.

Tôi hy vọng điều này sẽ giúp bất kỳ nhà phát triển đồng nghiệp nào. Tôi đã dành một vài giờ tìm kiếm và sửa lỗi này, và hầu như không tìm thấy bất kỳ thông tin về nó trên web và StackOverflow.