Thêm lề trên mục ListView hàng đầu (và bên dưới cuối cùng) trong Android


147

Đâ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 rìa của phần đệm.

Tôi đến từ nền phát triển web và sự 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).


chỉ xác định lề trái & phải ... hãy thử dán xml của bạn vào đây, để tôi có thể thấy phần chỉnh sửa sự cố: chờ đã, ý bạn là .... Bạn muốn phần đệm trên cùng và dưới cùng cũng được cuộn?
Tek Yin

Tôi không thể chỉ định lề trái và lề phải - không có 'lề' trong bố cục Android, chỉ có phần đệm. Nhưng, vâng, tôi thực sự muốn phần đệm trên và dưới được cuộn - đó là một cách hay để mô tả nó.
Mick Byrne

Tôi đã thử một vài phương thức và vẫn thất bại .. Tôi có một số thủ thuật phải làm, nhưng sẽ khó thực hiện hơn ... bạn đặt 2 đối tượng tùy chỉnh vào mục danh sách ở vị trí đầu tiên và cuối cùng .. và sử dụng bộ điều hợp tùy chỉnh để phát hiện vật phẩm và vẽ nó khác nhau (chiều cao hẹp & trong suốt)
Tek Yin

Vâng ... đó là những gì tôi đã nghĩ để trở lại là tốt. Nhưng có đủ loại phức tạp với điều đó, vì sau đó tôi sẽ cần đặt màu nền trong các mục danh sách, chứ không phải chế độ xem, điều đó có nghĩa là sau đó tôi sẽ cần phải tự hack một cách hiệu quả để hiển thị khi bạn chạm vào mọi thứ . Dù sao cũng cảm ơn sự giúp đỡ của bạn ...
Mick Byrne

Tin tốt .. Tôi đã có giải pháp ... bạn có thể sử dụng addHeaderView (Xem v) trên ListActivity .. chỉ cần gọi getListView(). addHeaderView(capView)getListView(). addHeaderView(botView) đảm bảo rằng nó được gọi trước khi khởi tạo nội dung của danh sách, vd. setListAdOG (bộ chuyển đổi);
Tek Yin

Câu trả lời:


397

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 rìa 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)

4
Ngoài ra, điều này có thể được thực hiện thành một phong cách hoặc chủ đề thông qua<item name="android:clipToPadding">false</item>
pjco

2
Ồ, điều này cũng áp dụng cho ScrollView
pjco

4
Hơi muộn khi thảo luận, nhưng lưu ý rằng trên các thiết bị cũ hơn (tôi đã phát hiện ra nó trên một số thiết bị 2.3.x), danh sách các mục xem được tái chế quá sớm. Mặc dù pha vẽ biết nó có thể vẽ ở đó, nhưng pha bố trí thì không, vì vậy nó nghĩ rằng vật phẩm đã tắt màn hình. Xem stackoverflow.com/questions/15915226/ hàn .
Jeffrey Klardie

@JeffreyKlardie Tôi gặp phải vấn đề khi các vật phẩm được tái chế quá sớm trên thiết bị cũ hơn và nó thậm chí còn khiến thanh cuộn tự thay đổi kích thước khi đang di chuyển, trông rất kỳ lạ. @pjco Tôi không chắc tại sao nhưng cài đặt clipToPaddingqua một kiểu không phù hợp với tôi, giống như nếu nó không được áp dụng. Mặc dù, nếu tôi đặt nó trực tiếp trên ListView thì nó hoạt động.
ForceMagic

5
Đừng quên android:scrollbarStyle="outsideOverlay"vì vậy thanh cuộn cũng đi qua phần đệm
jfcartier

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.


4
Cảm ơn câu trả lời! Hoạt động tuyệt vời !! Nếu bạn muốn đặt chiều cao trong dp, có thể thực hiện bằng DisplayMetrics: float mDensity = getResources().getDisplayMetrics().density; int height = (int) (50 * mDensity + 0.5f); padding.setHeight(height);
Tony Ceralva

3
Hoặc tốt hơn nữa, hãy làm mờ các dp ở cấp độ Java bằng cách sử dụng getResource (). GetDimensionPixel Offerset (R.dimen.some_value);
greg7gkb

1
Thật sự ngạc nhiên về số lượng công cụ Android tôi học được trên StackOverflow so với những thứ tôi học được trên trang web của nhà phát triển
TrueCoke

1
Hoặc thậm chí tốt hơn(int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 100, getResources().getDisplayMetrics());
Eugen Pechanec

1
Không có phương thức "setHeight ()" cho View trong API 23. Thay vào đó, chúng ta có thể sử dụng "setMinimumHeight ()".
KWA

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 các quan điểm Header và Footer để 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.


1
Tôi sẽ tư vấn cho bất cứ ai có thể sử dụng dải phân cách thay vì trong lề và miếng đệm. Câu trả lời tuyệt vời
dzsonni

2

Giải pháp của tôi bằng cách 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);

1

Câu trả lời của @Gunnar Karlsson là tốt, nhưng có một vấn đề về lượt xem tế bào được tái chế sớm khi hoàn toàn đứng 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.


"Không có tác dụng phụ" điều đó không hoàn toàn đúng. Thêm một lớp khác trong hệ thống phân cấp chế độ xem của bạn, đặc biệt là trong một mục listview, có nghĩa là làm giảm các màn trình diễn.
Teovald
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.