Android: ClassCastException при добавлении представления заголовка в ExpandableListView - PullRequest
44 голосов
/ 09 декабря 2010

Я пытаюсь добавить заголовок в 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)), но я не могу понять, почему.Есть идеи?

Ответы [ 4 ]

91 голосов
/ 09 декабря 2010

Хорошо, я понял это.Я избавился от ошибки времени выполнения, программно установив LayoutParams представления в ListView LayoutParams, например так:

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, который использует родитель, или вы получите ошибку времени выполнения.

4 голосов
/ 03 ноября 2014

Несмотря на то, что приведенный выше ответ мог бы работать для многих, есть еще лучшее объяснение. ClassCastException - это нормальное поведение после вызова listview.addHeaderView или listview.addFooterView.

Причина в том, что исходный адаптер обернут в HeaderViewListAdapter. Чтобы получить свой адаптер, используйте этот код.

YourAdapter ya = (YourAdapter) ((HeaderViewListAdapter)lv.getAdapter()).getWrappedAdapter();

Код взят здесь

1 голос
/ 28 ноября 2013

В моем случае это не сработало.Мне пришлось установить footerView для моего listView перед настройкой его адаптера.Сначала я инициализировал свой 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);
    }
}
0 голосов
/ 16 марта 2017

Вы должны поместить родительское представление в ваше раздутое представление.

ListView listview = (ListView) findViewById(R.id.listview);
headerView = View.inflate(this, R.layout.header, listview, false); // set listview as parent view
listview.addHeaderView(headerview);
...