Javaでヘッダーまたはフッターを追加する方法は知っていますが、XMLに直接追加できるかどうか疑問に思っていました。これをシミュレートしたくありませんが、実際にはフッターまたはヘッダーとして追加してください。
いいえ、可能だとは思いません。 ListViewソースコード に基づくoverScrollHeader/overScrollFooter
は、XML属性から使用できます。ただし、これらの属性はドローアブルのみを受け入れます。
ListView
の上/下のレイアウトでトリックを使用したくない場合。 ListView
を拡張して、カスタマイズされたView
に独自のフッターとヘッダーのサポートを実装できます。フッターとヘッダーがすでに実装されているため、それほど難しくありません。カスタマイズしたビューのコンストラクターで構文解析するXML属性を追加するだけです。
私は同じことを達成しようとしましたが(コードをよりクリーンに保ち、マークアップにXMLを使用し、ロジックにソースコードを使用するため)、私が見つけた唯一の解決策は、レイアウトのどこかにXMLでヘッダービューを定義し、それをデタッチしてヘッダーとしてリストビューに入れます。
たとえば、次のXMLがあるとします。
<ListView Android:id="@+id/myListView">
</ListView>
<LinearLayout Android:id="@+id/myHeader">
....
</LinearLayout>
あなたのコードでこれを行うことができます:
ListView myListView = (ListView) findViewById(R.id.myListView);
LinearLayout myHeader = (LinearLayout) findViewById(R.id.myHeader);
// Let's remove the myHeader view from it's current child...
((ViewGroup) myHeader.getParent()).removeView(myHeader);
// ... and put it inside ListView.
myListView.addFooterView(myHeader);
基本的に、ここで行うことは、膨張したLinearLayoutをその親から切り離し、ListViewヘッダーの子として設定することです。
これは理想的なソリューションではありませんが、手動でヘッダーを作成/インフレートするよりも簡単です。また、これは、「ホルダー」パターン内でこれを使用している場合、XMLインフレーションとビューの再利用の力を利用します。
これが誰かを助けることを願っています。
これは、BaseAdapterを拡張する私のAdapterクラスで、私が機能する方法です。私はAPI 23をターゲットにしています:
@Override
public View getView(int position, View view, ViewGroup parent) {
if (position == 0) {
if (view == null) {
LayoutInflater layoutInflater = LayoutInflater.from(mContext);
view = layoutInflater.inflate(R.layout.test_results_header, parent, false);
}
} else {
if (view == null) {
LayoutInflater layoutInflater = LayoutInflater.from(mContext);
view = layoutInflater.inflate(R.layout.test_result_item, parent, false);
}
}
非常に単純ですが、位置0のヘッダーXMLと残りのコンテンツXMLを膨らませます。ヘッダーまたはその他のXMLを配置する位置がわかっている場合は、ロジックで位置を確認し、その位置のそれぞれのXMLを拡張する必要があります。