2011-10-24 66 views
36

我有一個ListView與一堆物品在裏面。如何使頂部和底部商品的頂部邊距爲10dp,底部商品的底部邊距爲10dp?現在我可以在ListView上使用填充或邊距來做到這一點,但結果是,當您滾動ListView的邊緣時,屏幕底部會變爲10dp。無論如何圍繞這個?我也嘗試在我的適配器的getView方法中設置邊距,但是我沒有看到AbsListView.LayoutParams的任何邊距選項。任何幫助都會很棒。Android ListView的填充內容不移動ListView的高度?

感謝

+1

討厭的建議,但如何在第一/最後一個項目視圖頂部/底部填充?你將不得不在'getView'的所有視圖中檢查並設置它... – Knickedi

回答

121

的竅門是在您的視圖定義android:clipToPadding="false",例如:

<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

這正是我正在尋找的,並且是一個簡單的解決方案。這工作得很好,我正在構建Android 2.1-update1。 – Bobbake4

+1

爲什麼只能在Android 3.0以上?根據Android的參考,這個功能從一開始就一直存在(API Level 1):http://developer.android.com/reference/android/view/ViewGroup.html#setClipToPadding(boolean) – jenzz

+0

lol花了45分鐘嘗試以使其適用於各種填充和邊距設置。甚至來到clipToPadding,但誤解了它,並將其設置爲true :)謝謝 –

5

爲什麼不直接檢查相對於你的列表的大小項目的位置:

填充:

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

頁邊距使用

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

防爆:

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

這是提供的,您已經爲適配器正確實施了getCount()方法。

+0

這是一個很好的解決方案。使用G +類型的標題(在滾動上下滾動時)使得不可能擁有一個標題視圖,並且對列表視圖本身具有填充。 –

11

通過使用頁眉和頁腳,您可以在滾動區域內的ListView頂部和底部獲得空間。這裏有一個簡單的例子:

定義你的填料看法,我叫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"/> 

現在你onCreate方法是這樣的,假設你命名你的ListView 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); 

然後設置你的適配器。

+1

偉大的作品,我相信在所有的Android版本,而使用clipToPadding(上述解決方案)只適用於某些androd版本 – Don

+0

有用的答案,謝謝!我編輯它只是爲了消除不必要的複雜性。一個簡單的'View'將會很好 - 在另一個'LinearLayout'內不需要'LinearLayout'。 –