Làm cách nào để thêm footer trong ListView?


88

Tôi đang phát triển một ứng dụng, Trong ứng dụng của tôi, tôi đang sử dụng Listview để hiển thị dữ liệu bằng cách sử dụng phân tích cú pháp dom, tôi muốn footer trong listview, khi tôi nhấp vào footer, thêm dữ liệu vào chế độ xem danh sách, tôi đính kèm hình ảnh, tôi muốn thiết kế đó và quy trình, vui lòng tham khảo image1 và imgae2. Tôi đề cập đến footer trong hình chữ nhật màu đỏ

Fig1-Footer như "Tin tức khác"
văn bản thay thế

văn bản thay thế

Hình2-Thêm bản ghi 10 bổ sung được thêm vào listview

Câu trả lời:


205

Tạo bố cục dạng xem chân trang bao gồm văn bản mà bạn muốn đặt làm chân trang và sau đó thử

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

Bố cục cho footer có thể là một cái gì đó như thế này:

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

Lớp hoạt động có thể là:

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

7
Điều này là tốt, nhưng nếu bạn muốn chân trang được CỐ ĐỊNH trên màn hình, thay vì chỉ hiển thị khi cuộn xuống dưới cùng? Và điều gì sẽ xảy ra nếu bạn muốn footer hiển thị ngay cả khi danh sách là EMPTY? Xem câu hỏi đầy đủ trên stackoverflow.com/questions/12353701/… .
gcl1

33
Tôi đã gặp một số vấn đề làm cho mã này hoạt động và đã giải quyết chúng. Đây là những gì tài liệu addFooterView () nóiNOTE: 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 Trong trường hợp đó không phải là footer, chỉ là một phần tử bình thường trong bố cục của bạn nằm bên dưới dạng xem danh sách. Bạn biết đấy, hãy đặt nó bên dưới chế độ xem danh sách?
Davor

2
Chỉ cần một lời cảm ơn với @demonsten: nếu bạn gọi setAdapter () trước khi thêm lượt xem, bạn sẽ có một khoảng thời gian tồi tệ.
Ben Ogorek

1
nếu không có dữ liệu trong bộ điều hợp thì chân trang không được đính kèm (hiển thị). vậy làm thế nào chúng ta có thể hiển thị footer ngay cả khi không có dữ liệu trong bộ điều hợp? cảm ơn
Kalpesh Lakhani

10

Câu trả lời ở đây là một chút lỗi thời. Mặc dù mã vẫn giữ nguyên nhưng có một số thay đổi trong hành vi.

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

Thông tin về addFooterView()phương pháp

Thêm một dạng xem cố định để xuất hiện ở cuối danh sách. Nếu addFooterView()được gọi nhiều hơn một lần, các chế độ xem sẽ xuất hiện theo thứ tự chúng được thêm vào. Các lượt xem được thêm bằng cách gọi này có thể lấy tiêu điểm nếu họ muốn.

Hầu hết các câu trả lời trên đều nhấn mạnh điểm rất quan trọng -

addFooterView()phải được gọi trước khi gọi setAdapter(). Điều này để ListView có thể bọc con trỏ được cung cấp bằng một con trỏ cũng sẽ tính đến dạng xem đầu trang và chân trang.

Từ Kitkat, điều này đã thay đổi.

Lưu ý: Khi được giới thiệu lần đầu, phương thức này chỉ có thể được gọi trước khi thiết lập bộ điều hợp với setAdapter (ListAdapter). Bắt đầu với KITKAT, phương thức này có thể được gọi bất kỳ lúc nào. Nếu bộ điều hợp của ListView không mở rộng HeaderViewListAdapter, nó sẽ được bọc bằng một phiên bản hỗ trợ của WrapperListAdapter.

Tài liệu


9

Tôi biết đây là một câu hỏi rất cũ, nhưng tôi đã truy cập theo cách của mình ở đây và nhận thấy câu trả lời được cung cấp không thỏa mãn 100%, bởi vì như gcl1 đã đề cập - theo cách này, footer không thực sự là một footer cho màn hình - nó chỉ là một "add-on" "vào danh sách.

Điểm mấu chốt - đối với những người khác có thể google theo cách của họ ở đây - tôi đã tìm thấy đề xuất sau đây ở đây: Chân trang đã sửa và luôn hiển thị bên dưới ListFragment

Hãy thử làm như sau, trong đó điểm nhấn là nút (hoặc bất kỳ phần tử chân trang nào) được liệt kê đầu tiên trong XML - và sau đó danh sách được thêm dưới dạng "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>

6

Nếu ListView là con của ListActivity:

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

(bên trong onCreate ())


2

Hoạt động mà bạn muốn thêm listview footer và tôi cũng đã tạo một sự kiện khi click vào listview footer.

  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>

0

Trong Câu hỏi này, câu trả lời tốt nhất không phù hợp với tôi. Sau đó, tôi tìm thấy phương pháp này để hiển thị chân trang dạng list,

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

Và tạo bố cục mới cuộc gọi 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>

Nếu không làm việc tham khảo bài viết này nghe


0

bạn có thể sử dụng stackLayout, bên trong bố cục này, bạn có thể đặt một khung danh sách, ví dụ:

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

Đây là kết quả:

nhập mô tả hình ảnh ở đây

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.