20

edittext フィールドが 1 つと「検索」ボタンが 1 つあります。検索をクリックすると、編集テキストに入力された値に対応するデータを含むリスト ビューを表示する必要があります。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);

私はどこで間違っていますか?

4

10 に答える 10

25

Android 2.3 では、setAdapter の後にヘッダーを追加すると (早期に追加してから削除した場合でも)、例外がスローされます。ヘッダーを動的に非表示または表示するには、setVisibility() を使用します。どのように?ヘッダー ビューの非表示を確認できます。

于 2014-03-01T07:20:09.840 に答える
1

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

于 2014-03-18T16:13:22.540 に答える
1

今日も同じ問題がありました。複数の ListViews があります。最初の情報を使用して、次のリストを作成し、全員がその中に setAdapter を持っています。私にとって、最良の解決策は置くことでした

setListAdapter(null);

関数の上に、ヘッダーを膨らませます。これが役立つことを願っています..

于 2014-12-02T13:31:12.407 に答える
1

これを試して..

dataAdapter = new MyCustomAdapter(this, R.layout.results_list_item, searchedResults);
myList.addHeaderView(header);
myList.setAdapter(dataAdapter);
dataAdapter.notifyDataSetChanged();
于 2013-10-25T07:59:59.760 に答える
1

android api によって例外がスローされます。KITKAT より下の API レベルでは、setAdapter() メソッドの前に addHeader() または addFooter() メソッドを呼び出す必要があります。

これは、API ドキュメントに記載されています。

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

于 2019-02-05T07:23:21.553 に答える
0

設定したら

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

listView.setAdapter(adapter);

問題はまだ現れました。それから Build > Clean Project を作りました。

于 2016-08-03T09:23:09.650 に答える
-1

多くの努力の後、私は自分の側の解決策を得ました。これが誰かにも役立つことを願っています

私はすでに最後に(ビューが追加された後)Adpaterを設定しましたが、同じエラーに苦しんでいた理由がわからないので、ここでこのコードのようなことをしました

// Set View here
View view = getLayoutInflater().inflate(R.layout.navigation_header,null);
mDrawerList.addHeaderView(view);
// init your adapter
adapter1 = new YourListAdapter(getApplicationContext(),blabla);
// set adapter into handler
Handler handler = new Handler();
handler.postDelayed(new Runnable() {        
   @Override
  public void run() {
  // TODO Auto-generated method stub
  mDrawerList.setAdapter(adapter1);
  }
}, 100);

アダプターをハンドラーに入れると、アダプターが表示よりも速く設定されることがあるので、このコードでこの例外を解決するのに十分です。:)

于 2015-07-02T09:54:34.043 に答える
-2

サンプル アプリケーションで次のコードを使用して、ListView ヘッダーを設定しました。

ListView lv = getListView();
View headerView = getLayoutInflater().inflate(R.layout.layout_header, null, false);
lv.addHeaderView(headerView);
final TumblrDB db = new TumblrDB(this);
c = db.query();
startManagingCursor(c);
adapter = new CustomCursorAdapter(this, R.layout.layout_del, c, new String[]{TumblrDB.DATE, TumblrDB.DESC}, new int[]{R.id.txt_a, R.id.txt_b});
lv.setAdapter(adapter);
于 2013-10-25T08:41:36.210 に答える