Jak dodać stopkę w ListView?

88

Rozwijam aplikację, W mojej aplikacji używam Listview do wyświetlania danych przy użyciu parsowania dom, chcę stopkę w listview, kiedy klikam stopkę dodatkowe więcej danych dodaj do widoku listy, załączyłem obrazek, chciałbym aby ten projekt i proces, zobacz image1 i imgae2. Wspominam o stopce w czerwonym prostokącie

Fig1-Stopka jak „Więcej wiadomości”
tekst alternatywny

tekst alternatywny

Fig2-Dodaj dodatkowe 10 rekordów dodanych w widoku listy

JohnNick
źródło

Odpowiedzi:

205

Utwórz układ widoku stopki składający się z tekstu, który chcesz ustawić jako stopkę, a następnie spróbuj

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

Układ stopki mógłby wyglądać mniej więcej tak:

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

Klasą aktywności może być:

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
źródło
7
To dobrze, ale co, jeśli chcesz, aby stopka była NAPRAWIONA na ekranie, a nie była widoczna tylko po przewinięciu do dołu? A co, jeśli chcesz, aby stopka była widoczna nawet wtedy, gdy lista jest PUSTA? Zobacz pełne pytanie na stackoverflow.com/questions/12353701/… .
gcl1,
33
Miałem problemy z uruchomieniem tego kodu i rozwiązałem je. Oto, co stwierdza dokumentacja 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 W tym przypadku nie jest to stopka, tylko zwykły element w układzie, który znajduje się poniżej widoku listy. Po prostu, wiesz, umieść to poniżej widoku listy?
Davor
2
Po prostu krzycz do @demonsten: jeśli wywołasz setAdapter () przed dodaniem widoków, będziesz się źle bawić.
Ben Ogorek
1
jeśli w adapterze nie ma danych, stopka nie jest dołączana (wyświetlana). więc jak możemy wyświetlić stopkę, nawet jeśli w adapterze nie ma danych? dzięki
Kalpesh Lakhani
10

Odpowiedzi tutaj są nieco nieaktualne. Chociaż kod pozostaje ten sam, nastąpiły pewne zmiany w zachowaniu.

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

Informacje o addFooterView()metodzie

Dodaj stały widok, aby pojawił się na dole listy. Jeśli addFooterView()zostanie wywołana więcej niż raz, widoki będą wyświetlane w kolejności, w jakiej zostały dodane. Widoki dodane za pomocą tego wywołania mogą być fokusem, jeśli chcą.

Większość powyższych odpowiedzi podkreśla bardzo ważny punkt -

addFooterView()musi być wywołane przed wywołaniem. setAdapter()To jest tak, że ListView może zawijać dostarczony kursor takim, który będzie również uwzględniał widoki nagłówka i stopki.

Od Kitkat to się zmieniło.

Uwaga: Po pierwszym wprowadzeniu tę metodę można było wywołać tylko przed ustawieniem adaptera za pomocą setAdapter (ListAdapter). Począwszy od KITKAT, tę metodę można wywołać w dowolnym momencie. Jeśli adapter ListView nie rozszerza HeaderViewListAdapter, zostanie opakowany z obsługującym wystąpieniem WrapperListAdapter.

Dokumentacja

Aniket Thakur
źródło
9

Wiem, że to bardzo stare pytanie, ale przeszukałem tutaj i uznałem, że udzielona odpowiedź nie jest w 100% satysfakcjonująca, ponieważ jak wspomniałem gcl1 - w ten sposób stopka nie jest tak naprawdę stopką na ekranie - to tylko "dodatek ”do listy.

Podsumowując - dla innych, którzy mogą tutaj wygooglować swoją drogę - znalazłem tutaj następującą sugestię: Naprawiona i zawsze widoczna stopka poniżej ListFragment

Spróbuj wykonać następujące czynności, w których nacisk kładzie się na przycisk (lub dowolny element stopki) wymieniony jako pierwszy w pliku XML - a następnie lista zostanie dodana jako „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
źródło
6

Jeśli ListView jest elementem podrzędnym ListActivity:

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

(wewnątrz onCreate ())

Andrzej
źródło
2

Działanie, w którym chcesz dodać stopkę widoku listy, a ja również wygenerowałem zdarzenie po kliknięciu stopki widoku listy.

  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
źródło
0

W tym pytaniu najlepsza odpowiedź nie działa dla mnie. Potem znalazłem tę metodę, aby wyświetlić stopkę widoku listy,

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

I utwórz nowy układ call 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>

Jeśli nie działa, zapoznaj się z tym artykułem, usłysz

Kusal Thiwanka
źródło
0

możesz użyć stackLayout, wewnątrz tego układu możesz umieścić listę w ramce, na przykład:

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

oto wynik:

wprowadź opis obrazu tutaj

x-rw
źródło