web-dev-qa-db-ja.com

XMLのリストビューにヘッダー/フッターを追加する

Javaでヘッダーまたはフッターを追加する方法は知っていますが、XMLに直接追加できるかどうか疑問に思っていました。これをシミュレートしたくありませんが、実際にはフッターまたはヘッダーとして追加してください。

20
Scorpio

いいえ、可能だとは思いません。 ListViewソースコード に基づくoverScrollHeader/overScrollFooterは、XML属性から使用できます。ただし、これらの属性はドローアブルのみを受け入れます。

ListViewの上/下のレイアウトでトリックを使用したくない場合。 ListViewを拡張して、カスタマイズされたViewに独自のフッターとヘッダーのサポートを実装できます。フッターとヘッダーがすでに実装されているため、それほど難しくありません。カスタマイズしたビューのコンストラクターで構文解析するXML属性を追加するだけです。

14
olegr

私は同じことを達成しようとしましたが(コードをよりクリーンに保ち、マークアップに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インフレーションとビューの再利用の力を利用します。

これが誰かを助けることを願っています。

5
Andrew Dunai

これは、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を拡張する必要があります。

0
zeeshan