【问题标题】:Adding bottom margin to ListView last element将底部边距添加到 ListView 最后一个元素
【发布时间】:2013-07-29 00:48:37
【问题描述】:

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

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

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

我看到的方法:

页脚

一种技巧——将带有空 TextView 的页脚添加到 ListView。但是页脚是很不稳定的东西,通常在 notifyDataSetChanged 后它们会消失,并且无法恢复

具有透明像素的图像

我要求设计师将透明像素添加到底部背景资源。不幸的是,在这种情况下,垂直居中完全被破坏了。 比如有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概念应该是可能的,但我找不到实现。有人知道吗?

还有其他想法吗?

【问题讨论】:

  • 您只想在最后一项后添加边距?
  • 是的。这个问题听起来一模一样
  • 请在下方查看我的回答
  • 我实际上会考虑使用页脚方法。我从未见过它们自己消失,尤其是在致电notifyDataSetChanged() 之后。如果发生这种情况,您可能做错了其他事情。页脚由ListView 管理,与适配器的实际数据集几乎没有关系。

标签: android centering android-drawable


【解决方案1】:

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

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

在 getCount 中返回 yourData.size+1。

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

      • 为此我推荐:listview.addFooterView(empty, data: null, isSelectable: false);
      【解决方案4】:

      在您的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"

      【讨论】:

      • 我从底部开始的 8dp 被剪掉了...实际上我只想要最后一项的 8dp 底部...那该怎么办?
      • @AndroidBeginner 我不明白你想要什么。这正是它的作用。
      • 不要忘记添加android:scrollbarStyle="outsideOverlay",这样您的滚动条就不会停留在填充内
      • 颜色可能有些问题。底部填充具有列表视图的背景颜色,而不是最后一项的背景颜色
      • 我们可以使用这个管理 SwipeRefreshLayout 刷新指示器吗?
      【解决方案5】:

      钟表匠的回答是最好的,也很聪明。您还可以创建一个空的页脚视图。

      【讨论】:

      • 第一个解决方案无效,但您的建议确实有效,确实是个好主意,谢谢
      【解决方案6】:

      如果你愿意,你也可以通过代码来做,例如我在这里做出反应 到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);
         }
      

      【讨论】:

        【解决方案7】:

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

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

        【讨论】:

        • 我在“将底部边距添加到适配器实现中的最后一项”中描述了这种方式。不知道有没有更优雅的方式。
        • 为什么不想这样做?
        • 请参阅相关解释。
        • 没有其他想法 - 所以似乎是唯一的方法
        • @Goofy 如何在列表的最后一行视图中添加边距?
        猜你喜欢
        • 1970-01-01
        • 2019-08-18
        • 2013-02-18
        • 2016-08-28
        • 1970-01-01
        • 2019-06-22
        • 2011-09-25
        • 1970-01-01
        • 2016-07-19
        相关资源
        最近更新 更多