Como adicionar um rodapé em ListView?

88

Estou desenvolvendo um aplicativo. No meu aplicativo, estou usando Listview para exibir dados usando análise de dom, quero rodar em listview, quando clico no rodapé mais dados adicionais adicionam à visualização de lista, anexei a imagem, gostaria desse design e processo, consulte a imagem 1 e a imgae 2. Menciono o rodapé no retângulo vermelho

Fig1-rodapé como "Mais notícias"
texto alternativo

texto alternativo

Fig2-Adicionar 10 registros adicionais adicionados em listview

JohnNick
fonte

Respostas:

205

Crie um layout de visualização de rodapé consistindo de texto que você deseja definir como rodapé e tente

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

O layout do rodapé pode ser algo assim:

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

A aula de atividade pode 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
fonte
7
Isso é bom, mas e se você quiser que o rodapé seja CORRIGIDO na tela, em vez de ficar visível apenas quando rolado para baixo? E se você quiser que o rodapé fique visível mesmo quando a lista estiver VAZIA? Veja a pergunta completa em stackoverflow.com/questions/12353701/… .
gcl1 de
33
Tive alguns problemas para fazer esse código funcionar e os resolvi. Aqui está o que afirma a documentação 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 Nesse caso, não é um rodapé, apenas um elemento comum em seu layout que está abaixo da visualização de lista. Apenas, você sabe, colocá-lo abaixo da exibição de lista?
Davor
2
Apenas um grito para @demonsten: se você chamar setAdapter () antes de adicionar as visualizações, você não terá problemas.
Ben Ogorek,
1
se não houver dados no adaptador, o rodapé não está anexando (sendo exibido). então, como podemos exibir o rodapé mesmo se não houver dados no adaptador? obrigado
Kalpesh Lakhani
10

As respostas aqui estão um pouco desatualizadas. Embora o código permaneça o mesmo, há algumas mudanças no comportamento.

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

Informações sobre o addFooterView()método

Adicione uma visualização fixa para aparecer na parte inferior da lista. Se addFooterView()for chamado mais de uma vez, as visualizações aparecerão na ordem em que foram adicionadas. As visualizações adicionadas por meio desta chamada podem ter foco, se quiserem.

A maioria das respostas acima enfatiza um ponto muito importante -

addFooterView()deve ser chamado antes de chamar setAdapter(). Isso é para que ListView possa envolver o cursor fornecido com um que também levará em conta as visualizações de cabeçalho e rodapé.

De Kitkat isso mudou.

Nota: Quando introduzido pela primeira vez, este método só poderia ser chamado antes de configurar o adaptador com setAdapter (ListAdapter). A partir do KITKAT, este método pode ser chamado a qualquer momento. Se o adaptador do ListView não estender HeaderViewListAdapter, ele será encapsulado com uma instância de suporte de WrapperListAdapter.

Documentação

Aniket Thakur
fonte
9

Eu sei que esta é uma pergunta muito antiga, mas pesquisei meu caminho até aqui e achei a resposta fornecida não 100% satisfatória, porque como gcl1 mencionou - dessa forma, o rodapé não é realmente um rodapé para a tela - é apenas um "complemento "para a lista.

Resumindo - para outras pessoas que podem pesquisar seu caminho até aqui no Google - encontrei a seguinte sugestão aqui: Rodapé fixo e sempre visível abaixo de ListFragment

Tente fazer o seguinte, onde a ênfase está no botão (ou qualquer elemento de rodapé) listado primeiro no XML - e, em seguida, a lista é adicionada 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
fonte
6

Se ListView for filho de ListActivity:

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

(dentro de onCreate ())

Andrey
fonte
2

A atividade na qual você deseja adicionar rodapé do listview e também gerar um evento no clique do rodapé do 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
fonte
0

Nesta pergunta, a melhor resposta não funciona para mim. Depois disso, encontrei este método para mostrar o rodapé do listview,

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

E criar uma nova chamada de layout 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>

Se não funcionar consulte este artigo ouça

Kusal Thiwanka
fonte
0

você pode usar um stackLayout, dentro desse layout você pode colocar uma lista em um quadro, por exemplo:

<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 é o resultado:

insira a descrição da imagem aqui

x-rw
fonte