1. ホーム
  2. Android

Androidです。ListView.addHeaderView()の使用方法と注意点

2022-02-17 19:50:28
<パス

I. 概要

ListViewコンポーネントの上に他のコンポーネントを追加し、新しいコンポーネントのようにリンクさせるには、コード内でlistView.addHeaderView(...)メソッドを使用します。.addHeaderView(...)を複数回使用すると、最初に追加されたコンポーネントが一番上になり、上から順番にリストされます。
listViewのposition = 0は、元のlistViewの1番目ではなく、view1に対応するようになりました。以下の画像のように。

など、複雑なレイアウトで複数レイアウトを行う場合のトラブルを解決することができます。 USG のlistViewの上部にある複雑なマルチレイアウトの実装は、その名の通り、「マルチレイアウト」です。

また、元のListViewを不可視にするには、listViewのアダプタのデータを空にして、可視にしたときにデータを復元する方法を使います。

次に、addHeaderViewとsetAdapterの順番です。

特記事項:addHeaderView、setAdapterの順に呼び出すと、このように例外が報告されることがあります。

java.lang.IllegalStateException: 
Cannot add header view to list --setAdapter has already been called.

原因:setAdapter()の後にaddHeaderView()が呼び出され、4.3以前のAndroidバージョンでコードが実行されているためです。これは、addHeaderViewの前にsetAdapterを呼び出しているためです。

III. 注意事項

1、集中力のための戦い。

Itemの中にButtonがある場合、ListViewのOnItemClickイベントをリスニングしていると、ListViewにOnItemClickイベントが設定された後は、Item内のButtonやImageButtonなどにフォーカスが奪われ、トリガーされなくなります。解決策は、Itemを初期化するときに、内部のButtonコントロールがフォーカスを取得しないようにブロックすることです。

setDescendantFocusability(ViewGroup.FOCUS_BLOCK_DESCENDANTS);

リストビューのonItemClickは正しくトリガーされますが、アイテム内のボタンのようなコントロールには影響しません。

2. メソッドをオーバーロードする。

リストビューがheaderViewを追加する必要があるとき、リストビューのaddHeaderView(headView, null, false)メソッドを呼び出すことによってそれを行うことができ、またオーバーロードされたメソッドaddHeaderView(headView)を持っています。これら二つのメソッドの違いは、前のメソッドがヘッダーを選択できるかどうかを制御し、選択したくない場合は第三パラメータに偽をセットするという点です。

3. 注文問題の詳細

ListViewにヘッダを追加する場合、アダプタにバインドする前に追加しないとエラーになります。というのも、setAdapter メソッドを呼び出すと、Android は現在の listview がすでにヘッダを追加しているかどうかを判断し、追加している場合は新しい tempAdapter を生成し、そこに設定したアダプタの内容すべてと listview のヘッダーおよびフッターを格納するからです。そのため、リストビューにヘッダーを追加した後にプログラム内で listview.getAdapter を呼び出すと、 setAdapter で渡したアダプタではなく tempAdapter を返します。 tempAdapter は独自のアダプタと同じです。 listview.getAdapter().getCount() メソッドは、ヘッダーを追加したため予想より大きな値を返します。

4. 場所の問題

上記の tempAdapter では、カスタムアダプタ内部の getItem メソッドが返す位置にはヘッダが含まれず、カスタムアダプタ内のデータの 0 から始まる位置番号、つまり渡したリストと同じ位置が返されると言っています。
そして、listviewのonItemClickメソッドで。

public void onItemClick(AdapterView

headViewとfooterViewの両方がonItemClickメソッドに応答することができ、headViewの位置は0、footerViewの位置は最大となります。
しかし、headViewとfooterViewのOnClickListenerをOnItemClickをオーバーライドするように設定することで、headviewやfooterViewをクリックすると、onItemClick()の代わりにOnClickListenerが起動するようにすることができます。
ListView.addHeaderView()を使用する場合、レイアウト管理の問題があり、しばしば型変換例外ClassCastExceptionが発生します。

java.lang.ClassCastException:android.widget.LinearLayout$LayoutParams cannot be cast to android.widget.

記事もご参照ください。 レイアウトタイプ変換例外の解決策
また、この記事のリファレンスの一部。 http://892848153.iteye.com/blog/1923680 神様、アドバイスありがとうございました