Androidです。ListView.addHeaderView()の使用方法と注意点
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 神様、アドバイスありがとうございました
関連
-
Error:Execution failed for task ':app:compileDebugJavaWithJavac' 根本的な解決方法
-
Android studio java ファイル表示 j burst red
-
Android Studio--警告。アプリはGoogle検索でインデックスされません
-
エラーを解決する SSLピアが正しくシャットダウンされない
-
Android 開発の問題点:ActivityNotFoundException: 明示的なアクティビティクラスを見つけることができません
-
adb push 権限拒否の解決策
-
Androidです。GridViewコントロールの使用
-
Intellij Ideaは、シンボルが見つからない、RクラスまたはRパッケージが存在しない、というエラーを報告します。
-
AndroidでデータをExcelファイルに書き出す方法
-
AndroidManifestの使用機能の設定
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
Android プロジェクトのライブラリに armeabi-v7a、armeabi、x86 が追加されました。
-
コンフィギュレーション 'compile' は廃止され、'implementati solution' に置き換わりました。
-
ERROR: x86 エミュレーションには現在ハードウェアアクセラレーションが必要です。
-
Android Control - TabLayout Usage Introduction
-
Androidのレイアウトにおけるmarginとpaddingの違いについて
-
AndroidのSMSメッセージ
-
Android SpinnerのsetSelectionとonItemSelectedイベントのトリガー順について
-
Android開発用アダプターシリーズ。カスタムアダプタを使ったスピナー
-
原因:android.content.res.Resources$NotFoundException。文字列リソースID #0x0
-
android start activity report android.content.res.Resources$NotFoundException: 文字列リソースID #0x0