Android: ClassCastException при добавлении заголовка в ExpandableListView
Я пытаюсь добавить заголовок в ExpandableListView так:
headerView = View.inflate(this, R.layout.header, null);
expandableListView.addHeaderView(headerView);
expandableListView.setAdapter(new SectionedAdapter(this));
Который дает мне следующую ошибку:
12-08 16:23:42.354:
ERROR/AndroidRuntime(421): Caused by:java.lang.ClassCastException: android.widget.LinearLayout$LayoutParams
12-08 16:23:42.354: ERROR/AndroidRuntime(421): at android.widget.ListView.clearRecycledState(ListView.java:504)
12-08 16:23:42.354: ERROR/AndroidRuntime(421): at android.widget.ListView.resetList(ListView.java:490)
12-08 16:23:42.354:ERROR/AndroidRuntime(421):at android.widget.ListView.setAdapter(ListView.java:422)
12-08 16:23:42.354:ERROR/AndroidRuntime(421): at android.widget.ExpandableListView.setAdapter(ExpandableListView.java:475)
Это происходит при вызове expandableListView.setAdapter(new SectionedAdapter(this))
, но я не могу понять, почему. Любые идеи?
Ответы
Ответ 1
Хорошо, я понял это. Я избавился от ошибки времени выполнения, запрограммировав настройку View LayoutParams в LayoutParams ListView, например:
headerView.setLayoutParams(new ListView.LayoutParams(ListView.LayoutParams.FILL_PARENT, ListView.LayoutParams.WRAP_CONTENT));
перед добавлением представления. Причина заключается в документах Android:
http://developer.android.com/reference/android/view/View.html#setLayoutParams (android.view.ViewGroup.LayoutParams)
который гласит, что:
Эти параметры подачи родитель этого представления, определяющий, как он должен быть организован. Здесь очень много подклассы ViewGroup.LayoutParams, и они соответствуют различным подклассы ViewGroup, которые ответственных за организацию их детей.
Итак, если вы добавляете представление в другое, вы ДОЛЖНЫ установить LayoutParams представления в тип LayoutParams, который использует родительский элемент, или вы получите ошибку времени выполнения.
Ответ 2
Несмотря на то, что вышеприведенный ответ может работать для многих, есть еще лучшее объяснение.
ClassCastException
- это нормальное поведение после вызова listview.addHeaderView
или listview.addFooterView
.
Причина в том, что исходный адаптер завернут в HeaderViewListAdapter
.
Чтобы ваш адаптер использовал этот код.
YourAdapter ya = (YourAdapter) ((HeaderViewListAdapter)lv.getAdapter()).getWrappedAdapter();
Код, взятый здесь
Ответ 3
В моем случае это не сработало. Я должен был установить footerView в свой списокView перед настройкой адаптера. Сначала я инициализировал свой loadView из файла макета в методе OnCreate:
LayoutInflater layoutInflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
loadingView = layoutInflater.inflate(R.layout.loading_view, null);
Затем я использовал это обходное решение в том же методе:
this.setIsLoading(true);
listView.setAdapter(adapter);
this.setIsLoading(false);
Где
private void setIsLoading(boolean isLoading)
{
this.isLoading = isLoading;
if (isLoading) {
listView.addFooterView(loadingView);
}
else {
listView.removeFooterView(loadingView);
}
}
Ответ 4
Вы должны поместить родительское представление в свое завышенное представление.
ListView listview = (ListView) findViewById(R.id.listview);
headerView = View.inflate(this, R.layout.header, listview, false); // set listview as parent view
listview.addHeaderView(headerview);