请告诉我我是否正确理解了这个问题......您想将某些行标记为选中,并且选中的行在视觉上看起来是缩进的(具有不同的颜色和边距)?
这里有2个技巧:
1 - 使用 StateListDrawable 作为行背景:
如果是这样,我将创建一个列表行布局文件并将“背景”属性设置为 StateListDrawable(可以是 XML)。这将允许该行切换选定和未选定的视觉状态。
StateListDrawable 的“drawable”属性将是一个 9-patch PNG,一个用于未选择状态,不包括边距,一个用于选定状态...选定的一个将在 PNG 本身内定义一个边距,通过指定内容区域/底部黑线不完全延伸到 PNG 的左侧,留下一个区域,即您的未缩放边距。
为了方便人们发现这一点,Radley Marx 刚刚在 9 补丁上发布了一篇出色的帖子:http ://radleymarx.com/blog/simple-guide-to-9-patch/
对于 ListViews,有时您想要关闭“listSelector”(这是一个单独的实体,呈现在列表上方或后面),而是使用“duplicateParentState”属性来允许行本身显示选择(没有列表需要选择器)。这可以提供更多的创作自由,尤其是当您希望在某些行或几种看起来都不同的行上具有可变宽度的边距时。完全取决于设计。
2 - 为每一行使用边距:
如果您决定需要多种类型的颜色指示器等,您可能必须使用不同的方法,提供一个边距属性(可能不会立即起作用)...这与 LayoutParams 的使用方式有关布局系统。我试图记住确切的细节,但我认为这是由于不同类型的 LayoutParam 子类,以及 MarginLayoutParam(或其子类)的属性,例如 marginLeft 可能会被 ListView 的布局代码忽略。您应该使用 AbsListView.LayoutParams 的实例,其中不包含边距选项。一种方法是将您的行嵌套在一个容器视图(子类)中,它允许在其 LayoutParams* 中留出边距。我确定我最终没有做这种无关的嵌套,但我
你提到放置一个 ImageView 并用颜色填充它。您可以查看几种替代方案...最高效的可能是定义自己的 ListRow 类并使用 onDraw() 自己实际绘制行内容, canvas.draw_xyz() 绘制小颜色选项卡,并为其余部分绘制文本等,而不是在复合布局中构建行。第二种使用布局的方法是使用较轻的 <View layout_height="match_parent" layout_width="4dip" background="#ffff0000" /> 例如。
*Android 布局中的一条黄金法则:复杂的 UI 层次结构会影响性能,尤其是 ListView 之类的东西。通常可以通过使用其他东西来避免这种情况:RelativeLayout、drawableTop(etc)、9-patch 图像,而不是添加更多视图。
如果我误解了并且以上内容太基本了,请您提供更多详细信息,也许是一张图表,表明您需要复制的确切部分。