Вопрос

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

Это было полезно?

Решение

Хорошо, я понял это. Я избавился от ошибки времени выполнения, программатически установив 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, и они соответствуют различным подклассам группы View, которые ответственны за организацию своих детей.

Таким образом, в основном, если вы добавляете представление другому, вы должны установить Layoutparams представления на тип LayoutParams, который использует родитель, или вы получите ошибку времени выполнения.

Другие советы

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

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

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

Код, взятый отсюда

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

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

ListView listview = (ListView) findViewById(R.id.listview);
headerView = View.inflate(this, R.layout.header, listview, false); // set listview as parent view
listview.addHeaderView(headerview);
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top