Android ListView padding для контента без перемещения высоты ListView?

У меня есть ListView с кучей элементов внутри него. Как сделать верхний и нижний элементы верхним краем 10 дп для верхнего элемента и нижнего поля 10 дп для нижнего элемента? Теперь я могу сделать это с помощью дополнения или поля в ListView, но результат заключается в том, что при прокрутке края списка ListView теперь находится 10dp в нижней части экрана. Во всяком случае, вокруг этого? Я также попытался установить поля внутри метода getView моего адаптера, но я не вижу никаких параметров маржи для AbsListView.LayoutParams. Любая помощь будет отличной.

Спасибо

Ответ 1

Фокус в том, чтобы включить 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" />

Ответ 2

Вы можете получить пространство вверху и внизу списка 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);

И затем установите адаптер.

Ответ 3

Почему бы просто не проверить позицию элемента относительно размера вашего списка:

Обивка:

 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() для вашего адаптера.