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
Если я удаляю заголовок, тогда нет ошибки. Какие-либо предложения? Спасибо.
Ответы
Ответ 1
Кажется, что всякий раз, когда вы используете представления заголовка/нижнего колонтитула в списке, ваш ListView обертывается с помощью HeaderViewListAdapter. Вы можете исправить это, используя приведенный ниже код:
((YourAdapter)((HeaderViewListAdapter)lv.getAdapter()).getWrappedAdapter()).notifyDataSetChanged();
Ответ 2
API 18 и ниже путают о том, что такое упаковка. Чтобы помочь ему, установите для вашего заголовка и/или нижнего колонтитула ПРИОР для назначения адаптера. Таким образом, правильная упаковка происходит под крышками. Затем снимите верхний/нижний колонтитул сразу после (если это то, что вы хотите).
myList.addFooterView(myFooterView);
myList.setAdapter(adapter);
myList.removeFooterView(myFooterView);
Ответ 3
Как написано в http://stanllysong.blogspot.ru/2013/08/javalangclasscastexception.html
это должно быть сделано так:
HeaderViewListAdapter hlva = (HeaderViewListAdapter)l.getAdapter();
YourListAdapter postAdapter = (YourListAdapter) hlva.getWrappedAdapter();
postAdapter.notifyDataSetChanged();
Ответ 4
@mussharapp ответ совершенно прав, и он работает! Однако я считаю более удобным просто кэшировать ваш адаптер на переменной-члене для последующего использования, прежде чем вы установите setAdapter():
mAdapter = new YourAdapter(ctx, items);
listView.addFooterView(v);
listView.setAdapter(mAdapter);
Ответ 5
Причиной исключения класса является то, что listview не упакован в заголовок. Поэтому мы не можем добавлять нижние колонтитулы или заголовок в список. Поэтому перед установкой адаптера в listview добавьте фиктивный вид в виде заголовка или нижнего колонтитула. Затем установите адаптер в listview. Это делает listview экземпляром headerviewslist. Затем вы можете легко добавлять и удалять нижние колонтитулы из списка в обычном режиме.
listview.addFooterView(new View(mContext));listview.setAdapter(yourAdapter):
После настройки адаптера вы можете добавить или удалить нижний колонтитул
listview.addFooterView(yourFooter); или listview.removeFooterView(yourFooter);
Ответ 6
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
}
}