Android ListView 填充内容而不移动 ListView 高度?

Posted

技术标签:

【中文标题】Android ListView 填充内容而不移动 ListView 高度?【英文标题】:Android ListView padding for content without moving ListView height? 【发布时间】:2011-12-14 12:04:20 【问题描述】:

我有一个 ListView,里面有一堆项目。如何使顶部和底部项目的顶部项目的顶部边距为 10dp,底部项目的底部边距为 10dp?现在我可以使用 ListView 上的填充或边距来执行此操作,但结果是,当您滚动 ListView 的边缘时,现在距离屏幕底部 10dp。无论如何围绕这个?我还尝试在我的适配器的 getView 方法中设置边距,但我没有看到 AbsListView.LayoutParams 的任何边距选项。任何帮助都会很棒。

谢谢

【问题讨论】:

讨厌的建议,但是第一个/最后一个项目视图的顶部/底部填充怎么样?您必须在getView...中的所有视图上检查并设置它... 【参考方案1】:

为什么不只检查项目相对于列表大小的位置:

填充:

 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() 方法。

【讨论】:

这是一个很好的解决方案。使用 G+ 类型的标题(向下滚动时向上滚动,向上滚动时向下滚动)使得不可能有一个标题视图并且不可能有对列表视图本身的填充。【参考方案2】:

您可以使用页眉和页脚在滚动区域内的 ListView 的顶部和底部获得空间。这是一个简单的例子:

定义填充视图,我将其命名为 header_footer.xml:

<?xml version="1.0" encoding="utf-8"?>
<View xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_
    android:layout_/>

现在您的 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);

然后设置你的适配器。

【讨论】:

效果很好,我相信所有的android版本,而使用clipToPadding(上面的解决方案)只适用于某些安卓版本 有用的答案,谢谢!我编辑它只是为了消除不必要的复杂性。一个简单的View 就可以了——不需要在另一个LinearLayout 中使用LinearLayout【参考方案3】:

诀窍是在您的视图定义中包含android:clipToPadding="false",例如:

<ListView android:id="@+id/list"
    android:layout_
    android:layout_
    android:paddingTop="16dip"
    android:paddingBottom="16dip"
    android:clipToPadding="false" />

【讨论】:

这正是我所寻找的,并且是一个简单的解决方案。这工作正常,我正在构建 Android 2.1-update1。 为什么只在 Android 3.0+ 中?根据 Android Reference,此功能从一开始就存在(API 级别 1):developer.android.com/reference/android/view/… lol 花了 45 分钟试图让它与各种填充和边距设置一起工作。甚至遇到了 clipToPadding 但误解了它并将其设置为 true :) 谢谢 在浪费了 2-3 小时弄清楚填充的工作原理之后,终于找到了一个可行的解决方案;_;

以上是关于Android ListView 填充内容而不移动 ListView 高度?的主要内容,如果未能解决你的问题,请参考以下文章

Android:在 ListView 中移动项目的窗口?

Android查看jfeinstein SlidingMenu布局顶部而不移动内容

一起学Android之ListView

填充 listview API 调用

带有 ArrayAdapter 的 ListView 未在 Android 11 上显示内容

Android:自定义 ListView 不会立即填充