2010-04-12 10 views
46

Actualmente tengo una clase que extiende la clase ListActivity. Necesito poder agregar algunos botones estáticos sobre la lista que están siempre visibles. Intenté tomar el ListView usando getListView() desde dentro de la clase. Luego utilicé addHeaderView (Ver) para agregar un pequeño diseño a la parte superior de la pantalla.Android: Agregar encabezado estático al principio de una ListActivity

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> 

Antes de que yo puse el adaptador que hago:

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

Esto se traduce en nada pasando a ListView a excepción de que se rellena a partir de mi base de datos. No aparecen botones arriba.

Otro enfoque lo intenté como agregar relleno a la parte superior de ListView. Cuando hice esto, se movió con éxito hacia abajo, sin embargo, si agregué alguno encima, presionó el ListView. No importa lo que haga, parece que no puedo poner unos botones encima de ListView cuando uso ListActivity.

Gracias de antemano.

synic, He intentado con anticipación. Lo intenté de nuevo solo por el bien de la cordura, y el botón no se mostró. A continuación se muestra el archivo de diseño de la actividad y el código que he implementado en oncreate().

// Mi ListActivity estoy tratando de agregar el encabezado de

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 para la actividad:

<?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> 

Respuesta

91

findViewById() sólo funciona para encontrar subvistas del objeto View. No funcionará en una identificación de diseño.

Tendrás que usar el inflador de diseño para convertir el xml a sus componentes de visualización correspondientes. Algo como esto:

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

No estoy seguro de por qué su código no se acaba de tirar un error. findViewById() probablemente solo estaba devolviendo null, por lo que no se agregó ningún encabezado a su lista.

+11

No creo que necesita para asignar y echo la cabecera inflado a una ViewGroup. ViewGroup extiende View, y el método addHeaderView de ListView acepta cualquier objeto View. –

+1

@Glenn Bech iam estoy de acuerdo con tu declaración –

+4

Perfecto, +1! Solo un comentario adicional: asegúrese de configurar el adaptador de lista ** después de ** agregar la vista de encabezado. Agregar el adaptador antes del encabezado me dio una excepción de tiempo de ejecución "No se puede agregar la vista de encabezado a la lista - setAdapter como ya se ha llamado" – Addi

7

Después de algunas investigaciones, pude deducir que al mezclar TableLayout y LinearLayout en mi documento XML de ListActivity, pude agregar un encabezado al documento. A continuación está mi documento XML, si alguien está interesado en verlo. Si bien el enfoque de Synic es probablemente el enfoque correcto después de trabajar con su solución por algún tiempo, no pude hacerlo funcionar de la manera que lo quería.

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> 
0

la adición de una cabecera estática es fácil, basta con hacer una vista separada relativa que tiene la AlignParentTop (o abajo, derecha o izquierda) atributo establecido en verdadero.

+1

No se trata tanto de cómo crear un diseño con un encabezado, se trata de ListActivities que tiene sus propias ideas sobre su diseño. –

8

Aquí es el sollution más 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> 

o

<?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> 

en lugar de botón puede añadir otro diseño lineal horizontal

+0

¿Puede proporcionar el código de Java para esta solución, por favor? – lamba

+0

No hay nada especial en el código. actionbar y bottombar son solo otros diseños xml definidos en actionbar.xml y bottombar.xml. – pcu

4

La respuesta ListView anterior es útil, pero se desplaza con la lista y no mantiene los gráficos de encabezado en la parte superior. La mejor solución que he encontrado es establecer un título personalizado para la actividad. Aquí es lo que mi constructor se ve así:

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

Dónde your_listview_layout.xml configura un ListView, y your_header.xml contiene cualquiera que sea el diseño de cabecera personalizada que te gusta. Solo tenga en cuenta que las tres líneas de arriba deben llamarse exactamente en ese orden para no causar problemas de tiempo de ejecución.

El tutorial que me ayudó fue http://www.londatiga.net/it/how-to-create-custom-window-title-in-android/ y se pueden encontrar muchas páginas relacionadas en desbordamiento de pila al buscar el término "setFeatureInt"

Cuestiones relacionadas