web-dev-qa-db-fra.com

Ajouter un en-tête/pied de page dans une listview en XML

Je sais comment ajouter un en-tête ou un pied de page en Java, mais je me demandais si je pouvais l'ajouter directement dans le XML ... Je ne voudrais pas simuler ceci, mais l'ajoute vraiment comme pied de page ou en-tête!

20
Scorpio

Non, je ne pense pas que ce soit possible. Basé sur le code source de ListView il n'y a que overScrollHeader/overScrollFooter qui sont disponibles à partir d'attributs XML. Mais ces attributs n'acceptent que les tirables.

Si vous ne voulez pas utiliser des astuces avec des dispositions supérieures/inférieures à ListView. Vous pouvez étendre ListView et implémenter vos propres supports de pied de page et d'en-tête dans View personnalisé. Ce n'est pas si difficile car le pied de page et l'en-tête sont déjà implémentés. Vous devez uniquement ajouter des attributs XML d'analyse dans le constructeur de votre vue personnalisée.

14
olegr

J'essayais simplement d'obtenir la même chose (garder mon code plus propre et utiliser XML pour le balisage et le code source pour la logique), mais la seule solution que j'ai trouvée consiste à définir la vue d'en-tête avec XML quelque part dans votre mise en page, puis à la détacher et mettre dans ListView comme en-tête.

Par exemple, ayant ce XML:

<ListView Android:id="@+id/myListView">
</ListView>

<LinearLayout Android:id="@+id/myHeader">
    ....
</LinearLayout>

Vous pouvez le faire dans votre code:

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);

Fondamentalement, nous ne faisons que détacher le LinearLayout gonflé de son parent et le définir comme enfant d'en-tête ListView.

Ce n'est pas une solution idéale, mais cela reste plus facile que de créer/gonfler l'en-tête manuellement. De plus, cela utilise la puissance de l'inflation XML et de la réutilisation de la vue si vous l'utilisez dans un modèle "titulaire".

J'espère que ça aide quelqu'un.

5
Andrew Dunai

Voici comment cela a fonctionné pour moi, dans ma classe Adapter qui étend le BaseAdapter. Je cible l'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);
        }
    }

Assez simple, je gonfle un en-tête XML pour la position 0 et le contenu XML pour le reste. Si vous connaissez la position pour laquelle vous souhaitez un en-tête ou tout autre code XML, vous devez, dans votre logique, vérifier la position et gonfler le code XML correspondant à cette position.

0
zeeshan