2011-10-24 28 views
36

Tôi có một ListView với một loạt các mục bên trong nó. Làm cách nào để tạo các mục trên cùng và dưới cùng có lề trên 10dp cho mục trên và lề dưới 10dp cho mục dưới cùng? Bây giờ tôi có thể làm điều này với đệm hoặc lề trên ListView nhưng kết quả là khi bạn cuộn cạnh của ListView bây giờ là 10dp từ dưới cùng của màn hình. Dù sao xung quanh điều này? Tôi cũng đã thử thiết lập lề bên trong của phương thức getView của adapter của tôi nhưng tôi không thấy bất kỳ tùy chọn lề cho AbsListView.LayoutParams. Bất kỳ sự trợ giúp nào đều sẽ là tuyệt vời.Lớp phủ danh sách Android cho nội dung mà không di chuyển chiều cao ListView?

Cảm ơn

+1

Nasty gợi ý, nhưng làm thế nào về một đỉnh/đáy đệm cho xem mục đầu tiên/cuối cùng? Bạn sẽ phải kiểm tra và đặt nó trên tất cả các khung nhìn trong 'getView' ... – Knickedi

Trả lời

121

Bí quyết là để bao gồm android:clipToPadding="false" trong định nghĩa khung nhìn của bạn, ví dụ .:

<ListView android:id="@+id/list" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:paddingTop="16dip" 
    android:paddingBottom="16dip" 
    android:clipToPadding="false" /> 
+1

Đây chính xác là những gì tôi đang tìm kiếm và là một giải pháp đơn giản. Điều này làm việc tốt và tôi đang xây dựng chống lại Android 2.1-update1. – Bobbake4

+1

Tại sao chỉ trong Android 3.0 trở lên? Theo tài liệu tham khảo của Android, tính năng này đã có ngay từ đầu (API Cấp 1): http://developer.android.com/reference/android/view/ViewGroup.html#setClipToPadding (boolean) – jenzz

+0

lol đã dành 45 phút để thử để có được điều này để làm việc với tất cả các loại padding và thiết lập lề. Thậm chí đến trên clipToPadding nhưng hiểu lầm nó và đặt nó thành true :) Cảm ơn –

5

Tại sao không chỉ cần kiểm tra vị trí của mặt hàng tương đối so với kích thước danh sách của bạn:

Padding:

public View getView(int position, View convertView, ViewGroup parent) 
    { 
     //recycle views and whatever else you normally would do goes here.. 
     //... 
     //... 

     if (position == 0){ 
      convertView.setPadding(0, 10, 0, 0); //padding on top for top item 
     } 
     else if (position == getCount() - 1){ 
      convertView.setPadding(0, 0, 0, 10); //padding on bottom for bottom item 
     } 
     else{ 
      convertView.setPadding(0, 0, 0, 0); //no padding 
     } 
} 

Đối với lợi nhuận sử dụng

LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT); 
lp.setMargins(left, top, right, bottom); 
convertView.setLayoutParams(lp); 

Ex :

public View getView(int position, View convertView, ViewGroup parent) 
    { 
      //recycle views and whatever else you normally would do goes here.. 
      //... 
      //... 
      LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT,  LinearLayout.LayoutParams.WRAP_CONTENT); 
      if (position == 0){ 
       lp.setMargins(0, 10, 0, 0); //margin on top for top item 
      } 
      else if (position == getCount() - 1){ 
       lp.setMargins(0, 10, 0, 10); //margin on bottom for bottom item 
      } 
      else{ 
       lp.setMargins(0, 0, 0, 0); //no margin 
      } 
      convertView.setLayoutParams(lp); 
    } 

điều này được cung cấp bạn đã triển khai phương thức getCount() phù hợp với bộ điều hợp của bạn.

+0

Đây là một giải pháp tuyệt vời. Sử dụng G + loại tiêu đề (mà đi lên trên di chuyển xuống và xuống trên di chuyển lên) làm cho nó không thể có một headerview và có paddings để listview chính nó. –

11

Bạn có thể lấy khoảng trống ở trên cùng và dưới cùng của ListView, bên trong vùng cuộn, bằng cách sử dụng đầu trang và chân trang. Dưới đây là một ví dụ nhanh:

Xác định xem phụ của bạn, mà tôi đặt tên header_footer.xml:

<?xml version="1.0" encoding="utf-8"?> 
<View xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="10dp"/> 

Bây giờ phương pháp onCreate của bạn trông như thế này, giả sử bạn đặt tên ListView bạn listView:

final LayoutInflater inflater = 
     (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    final View headerFooter = inflater.inflate(R.layout.header_footer, null); 
    listView.addFooterView(headerFooter); 
    listView.addHeaderView(headerFooter); 

Và sau đó đặt bộ điều hợp của bạn.

+1

Hoạt động tuyệt vời, tôi tin vào tất cả các phiên bản Android, trong khi sử dụng clipToPadding (giải pháp ở trên) chỉ hoạt động trên một số phiên bản androd – Don

+0

Câu trả lời hữu ích, cảm ơn! Tôi đã chỉnh sửa nó chỉ để loại bỏ sự phức tạp không cần thiết. Một 'View' đơn giản sẽ làm tốt - không cần một' LinearLayout' bên trong 'LinearLayout' khác. –

Các vấn đề liên quan