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

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

благодаря

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

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

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

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

Обивка:

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