最近根据设计图写listView 的时候,listView个item 之间存在间距,左右上下都有,一开始的想法是在item 的根布局 设置margin 属性,但是在listView 中margin 无法生效,所以在此研究下失效的原因。而解决办法就是在加一层布局,作为根布局 设置padding ,或者 新增根布局的下一次布局设置margin.

下面直接看效果图:


1.解决办法,我这里使用的是再嵌套一层布局加padding的方案

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:orientation="horizontal"android:layout_width="match_parent"android:layout_height="wrap_content"android:paddingTop="5dp"android:paddingBottom="5dp"android:paddingLeft="8dp"android:paddingRight="8dp"android:background="@color/transparent"><!-- 最上层控制item 的间隔的 --><LinearLayoutandroid:orientation="horizontal"android:layout_width="match_parent"android:layout_height="wrap_content"android:padding="8dp"android:background="@drawable/home_listitem_style">

当然你也可以选择 在再嵌套一层布局的下面的一层布局,使用margin 一样的效果,如果没有左右的间距只有上下的间距,还有一种方案就是 设置dividerHeight 的高度,颜色为透明就可。

2.着重研究的是margin失效的原因

这是我看到的一段解释,
The fact is that, the margin of LinearLayout (child) asks its parent layout (container) to give child layout a margin of x value.

So if the parent layouts’ LayoutParams support the margins then that margin is honored and applied.

ListView uses AbsListView.LayoutParams by default, which doesn’t include any margin support, just the height and width, thats why, it simply ignores the params value for margins.

  • 2.1 ListView extends AbsListView 查看 AbsListView 如何加入布局参数的

直接使用的是ViewGroup的 layoutParams, 没有包含 margin 的信息,在viewGroup 源码中发现

有个叫 MarginLayoutParams 的类,继续查看他的实现类 ,其中并没有发现AbsListView,

而在 ViewGroup layoutParams 中的实现类中却发现了 AbsListView

由此说明 listView 根布局中 设置margin 直接被忽略了,因为没有实现 marginLayoutParams ,虽然子类LinearLayout 里面设置margin 是有效的,但是其父类 AbsListView layoutparams 并没有实现 marginLayoutParams,没有提供相关的margin 的值,所以子类中也获取不到对应的值,尽管已经设置了。

参考的资料:
http://stackoverflow.com/questions/16278159/why-linearlayouts-margin-is-being-ignored-if-used-as-listview-row-view

3.为什么margin 失效,padding 却有效呢?

我个人的理解是:padding 是内边距,不需要父类,自己就是父类,就可以提供子类具体的距离和值等,而margin 是外边距,需要父类提供具体的距离,当父类不支持就无法获取到对应的值。

LinearLayout extends ViewGroup extends View

view 本身就可以提供padding 的属性,而margin 却需要父类的支持。

listView item 增加间距 以及item根部局 margin 失效原因相关推荐

  1. ScrollView 内嵌 ListView 只能看到第一个Item

    解决方案: 给ScrollView 设置 fillViewport 为 true,ListView 就不会只显示第一个了. <ScrollView xmlns:android="htt ...

  2. Android BaseAdapter和ViewHolder 优化 解决ListView的item抢焦点问题和item错乱问题

    首先赞下hyman大神 曾经仅仅是简单的重写个BaseAdapter,将getView方法保持抽象.而ViewHolder没有抽象过. .. ViewHolder (用了一个集合+泛型管理存取view ...

  3. android listview设置选中时的item的背景色

    今天实在不知道写些什么内容,所以自己在网上找了些资料,觉得还可以,所以还是写一下,觉得每天写些东西的习惯不能荒废. 默认情况下使用ListView背景色是黑色,选中item的高亮颜色是菊黄色,很多时候 ...

  4. android listview item 错位,Android BaseAdapter和ViewHolder 优化 解决ListView的item抢焦点问题和item错乱问题...

    首先赞下hyman大神 曾经仅仅是简单的重写个BaseAdapter,将getView方法保持抽象.而ViewHolder没有抽象过. .. ViewHolder (用了一个集合+泛型管理存取view ...

  5. listview当选中某一个item时设置背景色其他的不变

    2019独角兽企业重金招聘Python工程师标准>>> listview当选中某一个item时设置背景色其他的不变: 可以使用listview.setOnFoucsChangeLis ...

  6. 《如何更改其他程序ListView控件中某个Item的内容》

    <如何更改其他程序ListView控件中某个Item的内容> 天津 赵春生 ××× 一:程序说明: 这次我将介绍如何更改其他程序ListView控件中某个Item的内容,关于类似的拙文我已 ...

  7. ListView如何单独刷新一个item

    扣扣技术交流群:460189483 对于ListView数据的刷新大家都知道,改变Adapter的数据源,然后调用Adapter的notifyDateSetChanged()方法即可. 但是我在做公司 ...

  8. [Android] ListView中getView的原理+如何在ListView中放置多个item

    ListView 和 Adapter 的基础 工作原理: ListView 针对List中每个item,要求 adapter "给我一个视图" (getView). 一个新的视图被 ...

  9. 解决ActionBar中不显示item的问题,item显示在overflow中

    解决ActionBar中不显示item的问题,item显示在overflow中 一.问题描述       使用ActionBar时,需要增加一个菜单选项,即在/menu/main.xml的布局文件中添 ...

最新文章

  1. 批量导入LYNC 2010用户的联系人
  2. ASP.NET基础教程-SqlConnection对象-使用连接事件
  3. 函数中数据存储的问题
  4. 002 辅助框架的设计
  5. Amazon Aurora 深度探索
  6. failed to launch: nice -n 0 $HADOOP_HOME/bin/spark-class org.apache.spark.deploy.worker.Worker
  7. (转)Apache与Tomcat 区别联系
  8. WPF使用Canvas绘制可变矩形
  9. Swagger使用————接口参数注解的使用缺陷
  10. 【云快讯】之五十五《IBM推出Data Warehouse数据仓库云服务》
  11. python 中locals() 和 globals()的区别
  12. [python] 字典:按key排序或按value排序
  13. Redis后门植入分析报告
  14. 信息化建设规划制定的难点及关键点分析
  15. 知我者谓我心忧,不知我者谓我何求
  16. 人人商城 邀请人 成功购买会员卡之后返现
  17. 从小白到数据分析师的成长之路
  18. java matcher.group_详解正则表达式Matcher类中group方法
  19. Java网课基础笔记(20)19-08-02
  20. 期货开户线上线下开户流程

热门文章

  1. 澳大利亚:日本 3:1
  2. JPEG编码原理及简易编码器实现
  3. python多线程下载表情包
  4. 在中国,也能一辈子做程序员
  5. 中国软件网 给大家拜年啦:辞旧迎新,新春喜乐!
  6. 隐藏文件无法取消隐藏属性的解决[转]
  7. 机器学习实战之Logistic回归(四)从疝气病症状预测病马的死亡率(含数据集)
  8. 2023腾讯云服务器价格表(轻量/CVM/免费/GPU)
  9. NodeJS区块链实践(2)与区块链交互,基于区块链的web服务
  10. Windows 10修改用户名,终于不再受到中文路径名的摧残了