86

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

列表视图顶部

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

ListView 底部看起来不太好

我不想将底部边距添加到 ListView,我只需要最后一项的边距。

我看到的方法:

页脚

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

具有透明像素的图像

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

9补丁

和这样的布局:

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

结果:

结果

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

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

那应该可以,但是由于未知原因,我仍然无法正常工作。我不喜欢这种方式,因为我不喜欢在代码中修改尺寸。

所以

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

还有其他想法吗?

4

7 回答 7

289

在你的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"当您希望滚动条不溢出到填充区域时才使用。

于 2014-02-26T04:56:47.013 回答
8

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

TextView empty = new TextView(this);
empty.setHeight(150);
listview.addFooterView(empty);
于 2015-10-26T18:15:15.780 回答
4

you can also do it from code if you want, for example here I react to to EditText different situations:

   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);
   }
于 2015-02-23T06:05:13.730 回答
2

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

于 2015-02-24T01:54:12.050 回答
1

在您的 listView XML 代码中添加这两行:

android:transcriptMode="alwaysScroll"  
android:stackFromBottom="true"
于 2018-02-09T07:02:04.983 回答
0

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

在 getViewCount 中的适配器中返回 2。

在 getCount 中返回 yourData.size+1。

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

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

于 2018-07-02T07:21:47.837 回答
-2

我想您只想为最后一项添加边距:

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

于 2013-07-29T09:38:43.610 回答