ClassCastException с ListView при выполнении notifyDataSetChanged - PullRequest
38 голосов
/ 10 декабря 2010

Я добавил вид в заголовок listVivew,

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

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

adapter.notifyDataSetChanged();

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

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

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

Ответы [ 6 ]

124 голосов
/ 30 мая 2012

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

((YourAdapter)((HeaderViewListAdapter)lv.getAdapter()).getWrappedAdapter()).notifyDataSetChanged();
12 голосов
/ 11 августа 2014

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

myList.addFooterView(myFooterView);
myList.setAdapter(adapter);
myList.removeFooterView(myFooterView);
5 голосов
/ 01 апреля 2016

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

HeaderViewListAdapter hlva = (HeaderViewListAdapter)l.getAdapter();
YourListAdapter postAdapter = (YourListAdapter) hlva.getWrappedAdapter();
postAdapter.notifyDataSetChanged();
0 голосов
/ 17 августа 2017

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

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

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

0 голосов
/ 13 декабря 2014

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

mAdapter = new YourAdapter(ctx, items);
listView.addFooterView(v);
listView.setAdapter(mAdapter);
0 голосов
/ 17 апреля 2012
public class YourOwnList extends ListActivity {
    private EfficientAdapter mAdapter;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        mAdapter = new EfficientAdapter(/*your parameters for the adapter*/);
    }

    private void yourMethod () {
        mAdapter.notifyDataSetChanged();
    }

    private static class EfficientAdapter extends CursorAdapter {
        // your adapter
    }
}
...