Helpex - Trao đổi & giúp đỡ Đăng nhập
142

Đây là một câu hỏi khá hay về cách bố trí các mục trong ListView trong Android.

Tôi có một hoạt động với một thanh tiêu đề ở trên cùng và một ListView chiếm phần còn lại của màn hình. Tôi muốn ListView của mình xuất hiện với phần đệm 10dp ở bên trái, bên phải và trên cùng, nhưng khi bạn cuộn ListView lên, tôi muốn nó che phần đệm 10dp trên cùng trước khi biến mất dưới cạnh bị mờ. Tương tự, khi bạn cuộn xuống dưới cùng, mục danh sách cuối cùng sẽ xuất hiện với 10dp giữa phần dưới cùng của mục danh sách cuối cùng và phần dưới cùng của màn hình (nếu bạn đang tự hỏi tại sao, đó là vì tôi muốn có một hình nền đẹp thò ra xung quanh ListView).

Tôi đã thử thêm phần đệm vào chính ListView, nhưng sau đó khi bạn cuộn danh sách, nó sẽ biến mất dưới mép của phần đệm.

Tôi đến từ nền tảng web dev và tương tự sẽ là thêm lề trên mục danh sách đầu tiên (và bên dưới mục danh sách cuối cùng).

142 hữu ích 5 bình luận 45k xem chia sẻ
390

Bạn đã viết:

Tôi đã thử thêm phần đệm vào chính ListView, nhưng sau đó khi bạn cuộn danh sách, nó sẽ biến mất dưới mép của phần đệm.

Đặt ListView's clipToPaddingthuộc tính thành false. Điều này sẽ cho phép đệm xung quanh ListView cuộn đến cuối bố cục (và không chỉ đến cạnh của phần đệm).

Một ví dụ:

<ListView
    android:id="@+id/list_view"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:divider="@android:color/transparent"
    android:dividerHeight="10.0sp"
    android:padding="16dip"
    android:clipToPadding="false"/>

android:clipToPaddinglà một thuộc tính XML của ViewGroup, lớp cơ sở cho bố cục và khung nhìn các thùng chứa.

Cuộc gọi phương thức liên quan là:

public void setClipToPadding (boolean clipToPadding)
390 hữu ích 5 bình luận chia sẻ
19
View padding = new View(this);
padding.setHeight(20); // Can only specify in pixels unfortunately. No DIP :-(

ListView myListView = (ListView) findViewById(R.id.my_list_view);

myListView.addHeaderView(padding);
myListView.addFooterView(padding);

myListView.setAdapter(myAdapter);

ListView ở trên sẽ có phần đệm đầu trang và chân trang là 20 pixel.

19 hữu ích 5 bình luận chia sẻ
10

Nối vào câu trả lời của @ Jakobud ...

ListView của tôi đã sử dụng các android:divider/android:dividerHeightthuộc tính để tạo các khoảng trống trong suốt giữa các mục listView. Điều này cho phép tôi chỉ đơn giản là thêm android:headerDividersEnabledandroid:footerDividersEnabledthuộc tính và thiết lập Header và Footer quan đến new View(Activity.this).

Đơn giản hóa nhẹ cho các trường hợp bạn đã thiết lập bộ chia trong listView.

10 hữu ích 1 bình luận chia sẻ
2

Giải pháp của tôi sử dụng a ListFragment, dựa trên các giải pháp của @Jakobud và @ greg7gkb.

ListView listView = getListView();
listView.setDivider(null);
listView.setDividerHeight(getResources().getDimensionPixelSize(R.dimen.divider_height));
listView.setHeaderDividersEnabled(true);
listView.setFooterDividersEnabled(true);
View padding = new View(getActivity());
listView.addHeaderView(padding);
listView.addFooterView(padding);
2 hữu ích 0 bình luận chia sẻ
1

Câu trả lời của @Gunnar Karlsson là tốt, nhưng có một vấn đề về chế độ xem di động được tái chế sớm khi hoàn toàn nằm sau phần đệm, nhưng chưa hoàn toàn tắt màn hình. Đặt clipToPadding = false chịu trách nhiệm cho việc này và có thể hoặc không thể sửa trong phiên bản Android trong tương lai. ( Khi sử dụng clipToPadding trong ListView, các mục được tái chế sớm )

Tôi có một giải pháp đơn giản tốt đẹp không có tác dụng phụ:

  1. Thêm bố cục bên ngoài (tuyến tính hoặc tương đối) vào cell_design.xml của bạn
  2. Trên Bố cục bên ngoài này, thêm phần đệm (tức là 10dip) để tạo "lề" xung quanh toàn bộ ô. (Chỉ đệm NB sẽ hoạt động, không lề trên bố cục bên ngoài)
  3. Trên tập ListView android:dividerHeight="-10dip", ngược lại với những gì xung quanh ô

So với câu trả lời khác, không cần thiết lập màu chia. Phần đệm ở các ô trên cùng và dưới cùng sẽ xuất hiện và bộ chia âm sẽ ngăn các bộ chia chiều cao gấp đôi ở giữa.

1 hữu ích 1 bình luận chia sẻ
loading
Không tìm thấy câu trả lời bạn tìm kiếm? Duyệt qua các câu hỏi được gắn thẻ android android-layout android-listview , hoặc hỏi câu hỏi của bạn.

Có thể bạn quan tâm

loading