向ListView最后一个元素添加底部边距

时间:2013-07-29 09:32:24

标签: android centering android-drawable

我需要添加以添加具有复杂项目背景的ListView:顶部和底部的偶数/奇数和圆角不同。它看起来像这样:

ListView top

我已经通过level-list实现了所有这些东西,但还有一件事我想做。 现在底部项目靠近屏幕的底部。最好添加一些空间。

ListView bottom looks not good

我不想为ListView添加底部边距,我只需要最后一项的保证金。

我认为这样做的方式:

页脚

一种破解 - 将带有空TextView的页脚添加到ListView。但是页脚是非常不稳定的东西,它们通常在notifyDataSetChanged之后消失,并且没有办法让它们恢复

带透明像素的图像

我让设计师为底部背景资源添加透明像素。不幸的是,在这种情况下,垂直居中完全被打破。 例如,有这样的9patch:

9patch

这样的布局:

<?xml version="1.0" encoding="utf-8"?>

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
             android:layout_width="match_parent"
             android:layout_height="match_parent"
        >
    <!-- View with background with transparent pixels on bottom -->
    <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content"
                  android:id="@+id/item"
                  android:background="@drawable/some_bgr"
                  android:padding="10dp"
            >
        <TextView android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1"
                  android:text="Title"
                  android:layout_gravity="center"
                  android:textSize="18sp"
                />
        <TextView android:layout_width="wrap_content" android:layout_height="wrap_content"
                  android:text="Detail"
                  android:layout_gravity="center"
                  android:textSize="18sp"
                />
    </LinearLayout>

    <!-- Just for marking place took by view -->
    <FrameLayout android:layout_width="match_parent" android:layout_height="match_parent"
                 android:layout_below="@id/item"
                 android:background="#88ff55"
            />
</RelativeLayout>

结果:

Result

如您所见,居中不起作用。不幸。 (顺便说一句,如果指定这个9patch作为TextView的背景,居中效果很好。如果你知道任何文章,解释一下,请告诉我。)

将下边距添加到适配器实现中的最后一项

这应该有效,但由于未知原因,我仍然无法使其发挥作用。 我不喜欢这种方式,因为我不喜欢修改代码中的维度。

所以

已经有了想象的方法 - 用特定的位图和边距构造一些XML drawable。根据drawables概念应该是可能的,但我找不到实现。可能有人知道吗?

还有其他想法吗?

7 个答案:

答案 0 :(得分:248)

ListView中,设置paddingBottomclipToPadding="false"

  <ListView
      android:layout_width="match_parent"
      android:layout_height="match_parent"
      android:paddingBottom="8dp"
      android:clipToPadding="false"
      android:scrollbarStyle="outsideOverlay"/>
  • 这也适用于RecyclerView

  • 如果您希望滚动条不会溢出到填充区域,请仅使用android:scrollbarStyle="outsideOverlay"

答案 1 :(得分:7)

在列表中添加一个空页脚,如下所示:

TextView empty = new TextView(this);
empty.setHeight(150);
listview.addFooterView(empty);

答案 2 :(得分:3)

如果你愿意的话,你也可以从代码中做到这一点,例如我在这里做出反应 EditText的不同情况:

   if(s.toString().length()>0)
   {
      contacts_lv.setClipToPadding(false);
      contacts_lv.setPadding(0,0,0,270*screenDensity);
   }
   else
   {
      contacts_lv.setClipToPadding(true);
      contacts_lv.setPadding(0,0,0,0);
   }

答案 3 :(得分:2)

Clocksmith的回答是最好的,非常聪明。您还可以创建一个空的页脚视图。

答案 4 :(得分:0)

在listView XML代码中添加以下两行:

android:transcriptMode="alwaysScroll"  
android:stackFromBottom="true"

答案 5 :(得分:0)

另一种解决方案可能是您制作具有特定高度的模拟视图。

在适配器的getViewCount中返回2。

在getCount中返回yourData.size + 1。

在getViewType中,检查元素是否为最后一个元素,返回2;

在getView中使用此类型来填充模拟视图。

答案 6 :(得分:-2)

我想你只想在最后一项添加保证金:

所以你可以用这种方式在你的getview方法中做列表项的索引并检查它是否是最后一项,然后以编程方式向视图添加边距。