ClassCastException с ListView при выполнении notifyDataSetChanged

Я добавил представление в заголовок listVivew,

    View TopSearch =  (View) View.inflate(this, R.layout.search, null);
    lv.addHeaderView(TopSearch, null, false);

И все нормально, пока не попытаюсь выполнить (при изменении данных)

adapter.notifyDataSetChanged();

Это всегда приводит к сбою моего приложения, выдавая мне следующую ошибку:

> java.lang.ClassCastException: android.widget.HeaderViewListAdapter

Если я удалю представление заголовка, ошибки не будет. Какие-либо предложения? Спасибо.


person bobetko    schedule 09.12.2010    source источник
comment
Вам нужно использовать ListView.LayoutParams. Проверьте [этот вопрос][1]. [1]: stackoverflow.com/questions/4393775/   -  person Macarse    schedule 14.10.2011


Ответы (6)


Кажется, что всякий раз, когда вы используете представления верхнего/нижнего колонтитула в представлении списка, ваш ListView оборачивается с помощью HeaderViewListAdapter. Вы можете исправить это, используя следующий код:

((YourAdapter)((HeaderViewListAdapter)lv.getAdapter()).getWrappedAdapter()).notifyDataSetChanged();
person Mark Pazon    schedule 30.05.2012
comment
Мой listView.getAdapter() не является экземпляром HeaderViewListAdapter после добавления представления нижнего колонтитула. - person ono; 04.03.2015
comment
Большое спасибо. Я не мог следовать приведенному ниже подходу из-за структуры моего приложения. - person rahulinaction; 22.03.2015
comment
@ono: я думаю, это будет FooterViewListAdapter - person divyenduz; 20.05.2015
comment
Теперь я получаю, что android.widget.ExpandableListConnector не может быть приведен к * - person Killer; 15.02.2016
comment
Не так, см. stanllysong.blogspot.ru/2013/08/javalangclasscastexception.html. - person CoolMind; 01.04.2016

API 18 и ниже путаются в том, что он упаковывает. Чтобы помочь ему, установите верхний и/или нижний колонтитул ДО назначения адаптера. Таким образом, происходит правильная упаковка под одеялом. Затем сразу же удалите верхний/нижний колонтитул (если это то, что вы хотите).

myList.addFooterView(myFooterView);
myList.setAdapter(adapter);
myList.removeFooterView(myFooterView);
person Nebu    schedule 11.08.2014

Как написано в http://stanllysong.blogspot.ru/2013/08/javalangclasscastexception.html надо сделать так:

HeaderViewListAdapter hlva = (HeaderViewListAdapter)l.getAdapter();
YourListAdapter postAdapter = (YourListAdapter) hlva.getWrappedAdapter();
postAdapter.notifyDataSetChanged();
person CoolMind    schedule 01.04.2016

Ответ @mussharapp совершенно правильный, и он работает! Однако я считаю более удобным просто кэшировать ваш адаптер в переменной-члене для последующего использования, прежде чем вы выполните setAdapter():

mAdapter = new YourAdapter(ctx, items);
listView.addFooterView(v);
listView.setAdapter(mAdapter);
person Carlos Ginés    schedule 13.12.2014

Причина исключения приведения класса заключается в том, что представление списка не было перенесено в представление списка заголовков. Таким образом, мы не можем напрямую добавлять нижние колонтитулы или верхний колонтитул в список. Поэтому, прежде чем настраивать адаптер для просмотра списка, добавьте фиктивное представление в виде верхнего или нижнего колонтитула. Затем установите адаптер в список. Это делает listview экземпляром headerviewslist. Затем вы можете легко добавлять и удалять нижние колонтитулы из списка, как обычно.

listview.addFooterView(new View(mContext));listview.setAdapter(yourAdapter): 

После настройки адаптера вы можете добавить или удалить нижний колонтитул listview.addFooterView(yourFooter); или listview.removeFooterView(yourFooter);

person sathish    schedule 16.08.2017

person    schedule
comment
Добро пожаловать в StackOverflow. Всегда рекомендуется добавить пару строк о коде, который вы публикуете, это поможет другим участникам лучше понять ваш код. - person Vivek; 28.10.2012