web-dev-qa-db-ja.com

ヘッダービューをリストに追加できません-setAdapterは既に呼び出されています

1つのedittextフィールドと1つの「検索」ボタンがあります。検索をクリックすると、edittextに入力された値に対応するデータをリストビューに表示する必要があります。 addHeader()を使用してリストにヘッダーを追加しました。初めて検索したとき、リストにデータを表示できました。しかし、もう一度検索すると、以下のエラーが発生します。

FATAL EXCEPTION: main
Java.lang.IllegalStateException: Cannot add header view to list -- setAdapter has already been called.
at Android.widget.ListView.addHeaderView(ListView.Java:261)
at Android.widget.ListView.addHeaderView(ListView.Java:284)

アダプターを設定する前に、リストにヘッダーを割り当てました。

以下は私のコードです:

myList = (ListView) findViewById(R.id.searchResultsList);
View header = View.inflate(this, R.layout.search_results_header, null);
myList.addHeaderView(header, null, false);

dataAdapter = new MyCustomAdapter(this, R.layout.results_list_item, searchedResults);
myList.setAdapter(dataAdapter);

どこで間違っているのですか?

20
user2740599

Android 2.3では、ヘッダーをsetAdapterの後に追加すると(早期に追加してから削除した場合でも)例外がスローされます。ヘッダーを動的に非表示または表示するには、setVisibility()を使用します。方法 ヘッダービューの非表示 を参照してください。

25
ishitcno1

ヘッダービューをリストに追加できません-setAdapterは既に呼び出されています。ご覧のとおり、myList.addHeaderView(header)はmyList.setAdapter(adapter);の前に実行する必要があります。

12
user2919006

今日も同じ問題がありました。複数のリストビューがあります。最初の情報を使用して、次のリストのリストを作成し、全員にsetAdapterが含まれています。私にとって、最善の解決策は

setListAdapter(null);

関数の上に、ヘッダーを膨らませます。これがお役に立てば幸いです。

1
3k1

これを試して..

dataAdapter = new MyCustomAdapter(this, R.layout.results_list_item, searchedResults);
myList.addHeaderView(header);
myList.setAdapter(dataAdapter);
dataAdapter.notifyDataSetChanged();
1
Hariharan

XMLファイルのリストビューで_Android:entries_を使用した場合、addHeaderViewの前にそのsetAdapter()メソッドが呼び出されます。したがって、XMLレイアウトファイルのListViewから_Android:entries_ attributeを削除します。仕事になります。

1
AvisSiva

例外はAndroid api.KitKat以下のAPIレベルの場合、addHeader()メソッドまたはaddFooter()メソッドをsetAdapter()メソッドの前に呼び出す必要があります。

これは、APIドキュメントで言及されています。

注:最初に導入されたとき、このメソッドはsetAdapter(ListAdapter)でアダプタを設定する前にのみ呼び出すことができました。Build.VERSION_CODES.KitKat以降、このメソッドはいつでも呼び出すことができます。ListViewのアダプタが拡張しない場合HeaderViewListAdapter。WrapperListAdapter のサポートインスタンスでラップされます。

1
Manmohan Soni

アダプターを設定する前にFrameLayoutをヘッダービューとして追加し、FrameLaypoutでビューを動的に追加/削除できます。

1
Dmitry

設定した後

final ViewGroup header = (ViewGroup) inflater.inflate(R.layout.item, listView, false);
listView.addHeaderView(header, null, true); 

listView.setAdapter(adapter);

それでも問題が発生しました。次に、ビルド>プロジェクトのクリーンを作成しました。

0
CoolMind