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);
どこで間違っているのですか?
Android 2.3では、ヘッダーをsetAdapterの後に追加すると(早期に追加してから削除した場合でも)例外がスローされます。ヘッダーを動的に非表示または表示するには、setVisibility()を使用します。方法 ヘッダービューの非表示 を参照してください。
ヘッダービューをリストに追加できません-setAdapterは既に呼び出されています。ご覧のとおり、myList.addHeaderView(header)はmyList.setAdapter(adapter);の前に実行する必要があります。
今日も同じ問題がありました。複数のリストビューがあります。最初の情報を使用して、次のリストのリストを作成し、全員にsetAdapterが含まれています。私にとって、最善の解決策は
setListAdapter(null);
関数の上に、ヘッダーを膨らませます。これがお役に立てば幸いです。
これを試して..
dataAdapter = new MyCustomAdapter(this, R.layout.results_list_item, searchedResults);
myList.addHeaderView(header);
myList.setAdapter(dataAdapter);
dataAdapter.notifyDataSetChanged();
XMLファイルのリストビューで_Android:entries
_を使用した場合、addHeaderViewの前にそのsetAdapter()
メソッドが呼び出されます。したがって、XMLレイアウトファイルのListViewから_Android:entries
_ attributeを削除します。仕事になります。
例外はAndroid api.KitKat以下のAPIレベルの場合、addHeader()メソッドまたはaddFooter()メソッドをsetAdapter()メソッドの前に呼び出す必要があります。
これは、APIドキュメントで言及されています。
注:最初に導入されたとき、このメソッドはsetAdapter(ListAdapter)でアダプタを設定する前にのみ呼び出すことができました。Build.VERSION_CODES.KitKat以降、このメソッドはいつでも呼び出すことができます。ListViewのアダプタが拡張しない場合HeaderViewListAdapter。WrapperListAdapter のサポートインスタンスでラップされます。
アダプターを設定する前にFrameLayoutをヘッダービューとして追加し、FrameLaypoutでビューを動的に追加/削除できます。
設定した後
final ViewGroup header = (ViewGroup) inflater.inflate(R.layout.item, listView, false);
listView.addHeaderView(header, null, true);
前
listView.setAdapter(adapter);
それでも問題が発生しました。次に、ビルド>プロジェクトのクリーンを作成しました。