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);

Ответ 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
    }
}