web-dev-qa-db-ja.com

notifyDataSetChangedの実行時にListViewでClassCastExceptionが発生する

ListVivewのヘッダーにビューを追加しました。

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

そして、実行しようとするまで(データが変更されたとき)、すべてが正常です。

adapter.notifyDataSetChanged();

それは常に私のアプリケーションをクラッシュさせ、次のエラーを私に与えます:

> Java.lang.ClassCastException:Android.widget.HeaderViewListAdapter

ヘッダービューを削除してもエラーはありません。助言がありますか?ありがとう。

38
bobetko

リストビューでヘッダー/フッタービューを使用するときはいつでも、リストビューはHeaderViewListAdapterでラップされるようです。以下のコードを使用してこれを修正できます。

((YourAdapter)((HeaderViewListAdapter)lv.getAdapter()).getWrappedAdapter()).notifyDataSetChanged();
125
Mark Pazon

API 18以下は、何をラップしているかについて混乱しています。これを支援するには、アダプターを割り当てる前にヘッダーやフッターを設定してください。そうすれば、正しいラッピングがカバーの下で行われます。次に、直後にヘッダー/フッターを削除します(必要な場合)。

myList.addFooterView(myFooterView);
myList.setAdapter(adapter);
myList.removeFooterView(myFooterView);
12
Nebu

http://stanllysong.blogspot.ru/2013/08/javalangclasscastexception.html で書かれているように、そうする必要があります。

HeaderViewListAdapter hlva = (HeaderViewListAdapter)l.getAdapter();
YourListAdapter postAdapter = (YourListAdapter) hlva.getWrappedAdapter();
postAdapter.notifyDataSetChanged();
5
CoolMind

@mussharappの答え​​は完全に正しく、機能します。ただし、setAdapter()を実行する前に、後で使用するためにアダプターをメンバー変数にキャッシュする方が便利です。

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

クラスキャスト例外の理由は、リストビューがヘッダーリストビューにラップされなかったためです。そのため、フッターやヘッダーをリストビューに直接追加することはできません。したがって、アダプタをリストビューに設定する前に、ダミービューをヘッダーまたはフッタービューとして追加します。次に、アダプタをリストビューに設定します。これにより、listviewがheaderviewslistのインスタンスになります。その後、通常どおりリストビューからフッターを簡単に追加および削除できます。

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

アダプターを設定した後、フッターlistview.addFooterView(yourFooter);を追加または削除できます。またはlistview.removeFooterView(yourFooter);

0
sathish