¿Cómo agregar un pie de página en ListView?

88

Estoy desarrollando una aplicación, en mi aplicación, estoy usando Listview para mostrar datos usando el análisis de dom, quiero pie de página en la vista de lista, cuando hago clic en el pie de página, se agregan más datos a la vista de lista, adjunto una imagen, me gustaría ese diseño y proceso, consulte image1 e imgae2. Menciono pie de página en rectángulo rojo

Fig1-Pie de página como "Más noticias"
texto alternativo

texto alternativo

Fig2-Agregar 10 registros adicionales agregados en la vista de lista

JohnNick
fuente

Respuestas:

205

Cree un diseño de vista de pie de página que consta de texto que desea establecer como pie de página y luego intente

View footerView = ((LayoutInflater) ActivityContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE)).inflate(R.layout.footer_layout, null, false);
ListView.addFooterView(footerView);

El diseño del pie de página podría ser algo como esto:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:paddingTop="7dip"
    android:paddingBottom="7dip"
    android:orientation="horizontal"
    android:gravity="center">

    <LinearLayout 
        android:id="@+id/footer_layout" 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        android:gravity="center"
        android:layout_gravity="center">

    <TextView 
        android:text="@string/footer_text_1" 
        android:id="@+id/footer_1" 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" 
        android:textSize="14dip" 
        android:textStyle="bold" 
        android:layout_marginRight="5dip" />
    </LinearLayout>
</LinearLayout> 

La clase de actividad podría ser:

public class MyListActivty extends ListActivity {
    private Context context = null;
    private ListView list = null;

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        list = (ListView)findViewById(android.R.id.list);

        //code to set adapter to populate list
        View footerView =  ((LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE)).inflate(R.layout.footer_layout, null, false);
        list.addFooterView(footerView);
    }
}
Shaireen
fuente
7
Esto es bueno, pero ¿qué sucede si desea que el pie de página esté FIJO en la pantalla, en lugar de solo visible cuando se desplaza hacia la parte inferior? ¿Y si desea que el pie de página sea visible incluso cuando la lista esté VACÍA? Consulte la pregunta completa en stackoverflow.com/questions/12353701/… .
gcl1
33
Tuve algunos problemas para hacer que este código funcionara y los resolví. Esto es lo que indica la documentación de addFooterView ()NOTE: Call this before calling setAdapter. This is so ListView can wrap the supplied cursor with one that will also account for header and footer views.
demosten
13
@ gcl1 En ese caso, no es un pie de página, solo un elemento ordinario en su diseño que está debajo de la vista de lista. ¿Solo, ya sabes, ponerlo debajo de la vista de lista?
Davor
2
Solo un saludo a @demonsten: si llama a setAdapter () antes de agregar las vistas, lo pasará mal.
Ben Ogorek
1
si no hay datos en el adaptador, el pie de página no se adjunta (se muestra). Entonces, ¿cómo podemos mostrar el pie de página incluso si no hay datos en el adaptador? gracias
Kalpesh Lakhani
10

Las respuestas aquí están un poco desactualizadas. Aunque el código sigue siendo el mismo, hay algunos cambios en el comportamiento.

public class MyListActivity extends ListActivity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        TextView footerView = (TextView) ((LayoutInflater) this.getSystemService(Context.LAYOUT_INFLATER_SERVICE)).inflate(R.layout.footer_view, null, false);
        getListView().addFooterView(footerView);
        setListAdapter(new ArrayAdapter<String>(this, getResources().getStringArray(R.array.news)));
    }
}

Información sobre el addFooterView()método

Agregue una vista fija para que aparezca al final de la lista. Si addFooterView()se llama más de una vez, las vistas aparecerán en el orden en que se agregaron. Las vistas agregadas mediante esta llamada pueden enfocarse si lo desean.

La mayoría de las respuestas anteriores enfatizan un punto muy importante:

addFooterView()debe ser llamado antes de llamar setAdapter(). Esto es para que ListView pueda envolver el cursor provisto con uno que también tenga en cuenta las vistas de encabezado y pie de página.

Desde Kitkat esto ha cambiado.

Nota: Cuando se introdujo por primera vez, este método solo se pudo llamar antes de configurar el adaptador con setAdapter (ListAdapter). A partir de KITKAT, este método se puede llamar en cualquier momento. Si el adaptador de ListView no extiende HeaderViewListAdapter, se empaquetará con una instancia de soporte de WrapperListAdapter.

Documentación

Aniket Thakur
fuente
9

Sé que esta es una pregunta muy antigua, pero busqué en Google mi camino aquí y encontré que la respuesta no era 100% satisfactoria porque, como mencionó gcl1, de esta manera, el pie de página no es realmente un pie de página en la pantalla, es solo un "complemento "a la lista.

En pocas palabras , para otros que pueden buscar en Google aquí, encontré la siguiente sugerencia aquí: Pie de página fijo y siempre visible debajo de ListFragment

Intente hacer lo siguiente, donde el énfasis está en el botón (o cualquier elemento de pie de página) que aparece primero en el XML, y luego la lista se agrega como "layout_above":

<RelativeLayout>

<Button android:id="@+id/footer" android:layout_alignParentBottom="true"/> 
<ListView android:id="@android:id/list" **android:layout_above**="@id/footer"> <!-- the list -->

</RelativeLayout>
Ofer Lando
fuente
6

Si ListView es un elemento secundario de ListActivity:

getListView().addFooterView(
    getLayoutInflater().inflate(R.layout.footer_view, null)
);

(dentro de onCreate ())

Andrés
fuente
2

La actividad en la que desea agregar el pie de página de listview y también he generado un evento al hacer clic en el pie de página de listview.

  public class MainActivity extends Activity
{

        @Override
        protected void onCreate(Bundle savedInstanceState)
         {

            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);

            ListView  list_of_f = (ListView) findViewById(R.id.list_of_f);

            LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);

            View view = inflater.inflate(R.layout.web_view, null);  // i have open a webview on the listview footer

            RelativeLayout  layoutFooter = (RelativeLayout) view.findViewById(R.id.layoutFooter);

            list_of_f.addFooterView(view);

        }

}

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@drawable/bg" >

    <ImageView
        android:id="@+id/dept_nav"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@drawable/dept_nav" />

    <ListView
        android:id="@+id/list_of_f"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@+id/dept_nav"
        android:layout_margin="5dp"
        android:layout_marginTop="10dp"
        android:divider="@null"
        android:dividerHeight="0dp"
        android:listSelector="@android:color/transparent" >
    </ListView>

</RelativeLayout>
AndroidGeek
fuente
0

En esta pregunta, la mejor respuesta no funciona para mí. Después de eso, encontré este método para mostrar el pie de página de listview,

LayoutInflater inflater = getLayoutInflater();
ViewGroup footerView = (ViewGroup)inflater.inflate(R.layout.footer_layout,listView,false);
listView.addFooterView(footerView, null, false);

Y crea una nueva llamada de diseño footer_layout

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <TextView
        android:id="@+id/tv"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Done"
        android:textStyle="italic"
        android:background="#d6cf55"
        android:padding="10dp"/>
</LinearLayout>

Si no funciona consulte este artículo escuche

Kusal Thiwanka
fuente
0

puede usar un stackLayout, dentro de este diseño puede poner una lista en un marco, por ejemplo:

<StackLayout VerticalOptions="FillAndExpand">
            <ListView  ItemsSource="{Binding YourList}"
                       CachingStrategy="RecycleElement"
                       HasUnevenRows="True">

                <ListView.ItemTemplate>
                    <DataTemplate>
                        <ViewCell >
                            <StackLayout  Orientation="Horizontal">
                                <Label Text="{Binding Image, Mode=TwoWay}" />

                            </StackLayout>
                        </ViewCell>
                    </DataTemplate>
                </ListView.ItemTemplate>
            </ListView>
            <Frame BackgroundColor="AliceBlue" HorizontalOptions="FillAndExpand">
                <Button Text="More"></Button>
            </Frame>
        </StackLayout>

este es el resultado:

ingrese la descripción de la imagen aquí

x-rw
fuente