web-dev-qa-db-fra.com

Android: Ajout d'un en-tête statique en haut d'une ListActivity

Actuellement, j'ai une classe qui étend la classe ListActivity. Je dois pouvoir ajouter quelques boutons statiques au-dessus de la liste qui sont toujours visibles. J'ai essayé de récupérer ListView à l'aide de getListView () depuis la classe. Ensuite, j'ai utilisé addHeaderView (View) pour ajouter une petite mise en page en haut de l'écran.

Header.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout  xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:layout_width="fill_parent"
    Android:layout_height="fill_parent" >
    <Button 
        Android:id="@+id/testButton"
        Android:layout_width="fill_parent" 
        Android:layout_height="wrap_content"
        Android:text="Income" 
        Android:textSize="15dip"
        Android:layout_weight="1" />
</LinearLayout>

Avant de configurer l'adaptateur, je le fais:

ListView lv = getListView();
lv.addHeaderView(findViewById(R.layout.header));

Il en résulte que rien ne se passe dans ListView, à part qu'il soit rempli à partir de ma base de données. Aucun bouton n'apparaît au dessus.

Une autre approche que j'ai essayée consiste à ajouter un rembourrage en haut de ListView. Lorsque j’ai fait cela, il a été déplacé avec succès, cependant, si j’en ai ajouté un au-dessus, il a poussé le ListView. Quoi que je fasse, il semble que je ne puisse pas mettre quelques boutons au-dessus de ListView lorsque j'ai utilisé ListActivity.

Merci d'avance.

synic, j’ai essayé votre suggestion précédemment. Je l'ai réessayé juste pour des raisons de santé mentale, et le bouton ne s'est pas affiché. Vous trouverez ci-dessous le fichier de présentation de l'activité et le code que j'ai implémenté dans oncreate (). 

// My listactivity J'essaie d'ajouter l'en-tête à

public class AuditActivity extends ListActivity {

    Budget budget;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        Cursor test;
        super.onCreate(savedInstanceState);
        setContentView(R.layout.audit);
        ListView lv = getListView();
        LayoutInflater infalter = getLayoutInflater();
        ViewGroup header = (ViewGroup) infalter.inflate(R.layout.header, lv, false);
        lv.addHeaderView(header);
        budget = new Budget(this);
        /*
        try {
            test = budget.getTransactions();
            showEvents(test);
        } finally {

        }
        */
//      switchTabSpecial();
    }

Layout.xml pour l'activité:

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:layout_width="fill_parent" Android:layout_height="fill_parent">
    <ListView Android:id="@Android:id/list" Android:layout_width="wrap_content"
        Android:layout_height="wrap_content" />
    <TextView Android:id="@Android:id/empty" Android:layout_width="wrap_content"
        Android:layout_height="wrap_content" Android:text="@string/empty" />
</LinearLayout>
46
crv

findViewById() ne fonctionne que pour trouver des sous-vues de l'objet View. Cela ne fonctionnera pas sur un identifiant de mise en page.

Vous devrez utiliser layout inflater pour convertir le fichier XML en ses composants View correspondants. Quelque chose comme ça:

ListView lv = getListView();
LayoutInflater inflater = getLayoutInflater();
View header = inflater.inflate(R.layout.header, lv, false);
lv.addHeaderView(header, null, false);

Je ne sais pas pourquoi votre code n'a pas simplement généré une erreur. findViewById() retournait probablement juste null et aucun en-tête n'a été ajouté à votre liste.

91
synic

Voici la solution la plus simple:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
 xmlns:Android="http://schemas.Android.com/apk/res/Android"
 Android:orientation="vertical"
 Android:layout_width="fill_parent"
 Android:layout_height="fill_parent"
 Android:background="@color/background">
 <include layout="@layout/actionbar"/>
   <ListView
    Android:id="@+id/tasklist_TaskListView"
    Android:layout_width="fill_parent"
    Android:layout_height="0dip"
    Android:layout_weight="1"
    Android:textColor="@color/baseFont"/>
   <include layout="@layout/bottombar"/>
</LinearLayout>

ou

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
 xmlns:Android="http://schemas.Android.com/apk/res/Android"
 Android:orientation="vertical"
 Android:layout_width="fill_parent"
 Android:layout_height="fill_parent"
 Android:background="@color/background">
   <Button 
    Android:layout_width="fill_parent"
    Android:layout_height="wrap_content"/>
   <ListView
    Android:id="@+id/tasklist_TaskListView"
    Android:layout_width="fill_parent"
    Android:layout_height="0dip"
    Android:layout_weight="1"
    Android:textColor="@color/baseFont"/>
   <Button 
    Android:layout_width="fill_parent"
    Android:layout_height="wrap_content"/>

</LinearLayout>

au lieu de bouton, vous pouvez ajouter une autre mise en page linéaire horizontale 

8
pcu

Après quelques recherches, j'ai pu comprendre que mélanger TableLayout et LinearLayout au sein de mon document XML ListActivity m'a permis d'ajouter un en-tête au document. Ci-dessous, mon document XML si quelqu'un est intéressé à le voir. Bien que l’approche de Synic soit probablement la bonne après le travail avec sa solution, j’ai été incapable de la faire fonctionner comme je le voulais.

AuditTab.Java

public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.audittab);
        getListView().setEmptyView(findViewById(R.id.empty));
}

audittab.xml

<?xml version="1.0" encoding="utf-8"?>
<TableLayout 
    Android:layout_width="fill_parent"
    xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:layout_height="fill_parent">
    <TableRow 
        Android:layout_width="fill_parent"
        Android:layout_height="fill_parent" 
        Android:layout_gravity="center_horizontal">
        <LinearLayout 
            xmlns:Android="http://schemas.Android.com/apk/res/Android"
            Android:layout_width="fill_parent" 
            Android:layout_height="fill_parent"
            Android:orientation="horizontal" 
            Android:layout_weight="1">
            <Button 
                Android:id="@+id/btnFromDate" 
                Android:layout_width="fill_parent"
                Android:layout_height="wrap_content" 
                Android:text=""
                Android:layout_weight="1" />
            <Button 
                Android:id="@+id/btnToDate" 
                Android:layout_width="fill_parent"
                Android:layout_height="wrap_content" 
                Android:text=""
                Android:layout_toRightOf="@+id/btnFromDate"
                Android:layout_weight="1" />
            <Button 
                Android:id="@+id/btnQuery" 
                Android:layout_width="fill_parent"
                Android:layout_height="wrap_content" 
                Android:text="Query"
                Android:layout_toRightOf="@+id/btnToDate"
                Android:layout_weight="1" />

        </LinearLayout>
    </TableRow>
    <TableRow 
        Android:layout_width="fill_parent"
        Android:layout_height="fill_parent" 
        Android:layout_gravity="center_horizontal">
        <LinearLayout 
            Android:layout_width="fill_parent"
            Android:layout_height="fill_parent">
            <ListView 
                Android:id="@Android:id/list"
                Android:layout_width="300dip" 
                Android:layout_height="330dip"
                Android:scrollbars="none" />
            <TextView 
                Android:id="@+id/empty"
                Android:layout_width="wrap_content" 
                Android:layout_height="wrap_content"
                Android:paddingTop="10dip"
                Android:text="- Please select a date range and press query." />
        </LinearLayout>
    </TableRow>
</TableLayout>

AuditItem.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 
        xmlns:Android="http://schemas.Android.com/apk/res/Android"
        Android:layout_width="fill_parent" 
        Android:orientation="horizontal" 
        Android:padding="10sp">
    <TextView 
        Android:id="@+id/transactionDateLabel" 
        Android:layout_width="wrap_content" 
        Android:layout_height="wrap_content" 
        Android:text="Date: " />
    <TextView 
        Android:id="@+id/transactionDate" 
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content" 
        Android:layout_toRightOf="@id/transactionDateLabel" />
    <TextView 
        Android:id="@+id/transactionTypeLabel" 
        Android:layout_below="@id/transactionDate" 
        Android:layout_width="wrap_content" 
        Android:layout_height="wrap_content" 
        Android:text="Type: " />
    <TextView 
        Android:id="@+id/transactionType" 
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content" 
        Android:layout_marginLeft="10dip" 
        Android:layout_below="@id/transactionDate"
        Android:layout_toRightOf="@id/transactionTypeLabel" />

    <TextView 
        Android:id="@+id/transactionAmountLabel" 
        Android:layout_width="wrap_content" 
        Android:layout_height="wrap_content" 
        Android:layout_marginLeft="10dip"
        Android:text="Amount: " 
        Android:layout_below="@id/transactionDate"
        Android:layout_toRightOf="@id/transactionType" />
    <TextView 
        Android:id="@+id/transactionAmount" 
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content" 
        Android:layout_below="@id/transactionDate"
        Android:layout_toRightOf="@id/transactionAmountLabel" />
    <TextView 
        Android:id="@+id/transactionCategoryLabel" 
        Android:layout_width="wrap_content" 
        Android:layout_height="wrap_content" 
        Android:text="Category: " 
        Android:layout_below="@id/transactionAmountLabel" />
    <TextView 
        Android:id="@+id/transactionCategory" 
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:layout_below="@id/transactionAmountLabel" 
        Android:layout_toRightOf="@id/transactionCategoryLabel"
        />
    <TextView 
        Android:id="@+id/transactionToAccountLabel" 
        Android:layout_width="wrap_content" 
        Android:layout_height="wrap_content" 
        Android:text="To Account: " 
        Android:layout_below="@id/transactionCategoryLabel" />
    <TextView
        Android:id="@+id/transactionToAccount"
        Android:layout_width="wrap_content" 
        Android:layout_height="wrap_content"
        Android:layout_below="@+id/transactionCategoryLabel"
        Android:layout_toRightOf="@id/transactionToAccountLabel" />
    <TextView 
        Android:id="@+id/transactionFromAccountLabel" 
        Android:layout_width="wrap_content" 
        Android:layout_height="wrap_content" 
        Android:text="From Account: " 
        Android:layout_below="@id/transactionToAccountLabel" />
    <TextView
        Android:id="@+id/transactionFromAccount"
        Android:layout_width="wrap_content" 
        Android:layout_height="wrap_content"
        Android:layout_below="@id/transactionToAccountLabel"
        Android:layout_toRightOf="@id/transactionFromAccountLabel" />
    <TextView 
        Android:id="@+id/transactionNoteLabel" 
        Android:layout_width="wrap_content" 
        Android:layout_height="wrap_content" 
        Android:text="Note: " 
        Android:layout_below="@id/transactionFromAccountLabel" />
    <TextView 
        Android:id="@+id/transactionNote" 
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content" 
        Android:layout_below="@id/transactionFromAccountLabel" 
        Android:layout_toRightOf="@id/transactionNoteLabel" />
    <Button 
        Android:id="@+id/editTransactionBtn" 
        Android:layout_width="wrap_content"
        Android:layout_height="40sp" 
        Android:visibility="gone" 
        Android:text="Edit"
        Android:layout_below="@id/transactionNoteLabel"/>
    <Button 
        Android:id="@+id/deleteTransactionBtn" 
        Android:layout_width="wrap_content"
        Android:layout_height="40sp" 
        Android:text="Delete" 
        Android:layout_below="@+id/transactionNoteLabel" 
        Android:visibility="gone" 
        Android:layout_toRightOf="@+id/editTransactionBtn" 
        Android:ellipsize="end"/>
</RelativeLayout>
7
crv

La réponse ListView ci-dessus est utile mais fait défiler la liste et ne conserve pas les graphiques d'en-tête en haut. La meilleure solution que j'ai trouvée consiste à définir un titre personnalisé pour l'activité. Voici à quoi ressemble mon constructeur:

public void onCreate(Bundle savedInstanceState) {
    requestWindowFeature(Window.FEATURE_CUSTOM_TITLE);
    setContentView(R.layout.your_listview_layout);
    getWindow().setFeatureInt(Window.FEATURE_CUSTOM_TITLE, R.layout.your_header);
    ...

Où your_listview_layout.xml configure un ListView et your_header.xml contient la disposition d'en-tête personnalisée de votre choix. Notez simplement que les trois lignes ci-dessus doivent être appelées exactement dans cet ordre pour ne pas causer de problèmes d'exécution. 

Le tutoriel qui m'a aidé était http://www.londatiga.net/it/how-to-create-custom-window-title-in-Android/ et vous pouvez trouver de nombreuses pages en rapport avec le débordement de pile en effectuant une recherche. pour le terme "setFeatureInt"

4
Melinda Green

L'ajout d'un en-tête statique est simple. Créez simplement une vue relative distincte dont l'attribut alignParentTop (ou bottom, right ou left) est défini sur true.

0
rsfrost