Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/209.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android ListView行标记ala GMail_Android_Android Layout_Android Listview_Android 3.0 Honeycomb_Android Fragments - Fatal编程技术网

Android ListView行标记ala GMail

Android ListView行标记ala GMail,android,android-layout,android-listview,android-3.0-honeycomb,android-fragments,Android,Android Layout,Android Listview,Android 3.0 Honeycomb,Android Fragments,我感兴趣的是创建一个列表视图,其中每一行都按照GMail for 3.0+中的方式进行标记。这就很好地分离了左侧和右侧的ListFragment 其他示例还包括2.3.4版本的Google日历,例如,在ListView的左侧有一个颜色标记 请参见两个列表之间的灰色垂直分隔符。一个人是如何做到这一点的?一个额外的好处是交替宽度,但我想这只是一个较小的布局变化 我知道我可能会做一些事情,比如在那里插入一个ImageView,然后用我想要的颜色填充它,但在我看来,这是一个丑陋的黑客行为 另一个问题是

我感兴趣的是创建一个列表视图,其中每一行都按照GMail for 3.0+中的方式进行标记。这就很好地分离了左侧和右侧的ListFragment

其他示例还包括2.3.4版本的Google日历,例如,在ListView的左侧有一个颜色标记

请参见两个列表之间的灰色垂直分隔符。一个人是如何做到这一点的?一个额外的好处是交替宽度,但我想这只是一个较小的布局变化

我知道我可能会做一些事情,比如在那里插入一个ImageView,然后用我想要的颜色填充它,但在我看来,这是一个丑陋的黑客行为

另一个问题是,是否有一种通用的方式来组合这两个ListView片段,就像GMail或Mail应用程序那样

一个人是如何做到这一点的

即兴使用,我会使用一个具有所需背景颜色的
视图
,在需要时可见,在不需要时不可见

一个额外的好处是交替宽度,但我想这只是一个较小的布局变化

我不知道你说的“交替宽度”是什么意思。我认为在水平
线性布局中有两个
视图
具有所需的背景颜色,只有一个可见

我知道我可能会做一些事情,比如在那里插入一个ImageView,然后用我想要的颜色填充它,但在我看来,这是一个丑陋的黑客行为

嗯,
ImageView
比需要的要重一点。否则,我不明白为什么这是一个黑客。把它们想象成恰好是高、瘦、灰的图标,并不总是需要它们

另一个问题是,是否有一种通用的方式来组合这两个ListView片段,就像GMail或Mail应用程序那样


使用
RelativeLayout
,以便右侧碎片可以漂浮在左侧碎片上。

请告诉我是否正确理解了问题。。。。是否要将某些行标记为选定行,并且选定行在视觉上显示为缩进(使用不同的颜色和边距)

以下是两种技巧:

1-对行背景使用StateListDrawable:

如果是这样,我将创建一个列表行布局文件,并将“background”属性设置为StateListDrawable(可以是XML)。这将允许行切换选定和未选定的可视状态

StateListDrawable的“drawable”属性将是一个9-patch PNG,一个用于不包含边距的未选定状态,另一个用于选定的。。。选中的一个将在PNG本身中定义一个边距,方法是指定内容区域/底部黑线,使其不完全延伸到PNG的左侧,留下一个区域作为未缩放的边距

为了让人们发现这一点,Radley Marx刚刚在9补丁上发布了一篇精彩的帖子:

对于ListView,有时您需要关闭“listSelector”(它是一个单独的实体,呈现在列表上方或后面),而使用“duplicateParentState”属性允许行本身显示选择(不需要列表选择器)。这可以提供更多的创作自由,尤其是当您希望在某些行上具有可变宽度的边距,或者在几种类型的行上具有不同的外观时。但这完全取决于设计

2-为每行使用边距:

如果您决定需要多种类型的颜色指示器等等,您可能需要使用不同的方法,提供一个边距属性(这可能不会直接起作用)。。。这与布局系统如何使用LayoutParams有关。我试图记住确切的细节,但我认为这是由于LayoutParam子类的不同类型,以及MarginLayoutParam(或其子类)的属性(例如marginLeft)可能会被ListView的布局代码忽略。您应该使用AbsListView.LayoutParams的实例,该实例不包括页边距选项。一种方法是将行嵌套在容器视图(子类)中,该视图允许在其LayoutParams*中使用边距。我确信我最终没有做这种无关的嵌套,但我必须深入研究一些代码来记住更好的解决方案

您提到放置一个ImageView并用颜色填充它。你可以考虑几个备选方案。。。最有效的方法可能是定义自己的ListRow类并使用onDraw()亲自绘制行内容,canvas.draw_xyz()绘制小颜色选项卡,其余部分绘制文本等,而不是在复合布局中构建行。使用布局的第二种方法是重量更轻,例如

*Android布局中的一条金科玉律:复杂的UI层次结构对性能是致命的,尤其是对于ListView这样的东西。通常可以通过使用其他工具来避免这种情况:RelativeLayout、drawableTop(等)、9-patch图像,而不是添加更多视图


如果我误解了,上面的内容太基本了,请您提供一些更详细的信息,也许是一个图表,表明您需要复制的确切部分。

如果您想要速度,那么我会选择使用自定义视图类(例如扩展
RelativeLayout
)用于行容器视图,并覆盖
dispatchDraw(画布)
方法

dispatchDraw
方法在视图绘制其自身内容之后调用,在它绘制其子对象之前调用,子对象在调用
super.dispatchDraw
时被绘制

用这个做一些类似的事情

private boolean mDrawMarker = false;

public void setShouldDrawMarker(boolean drawMarker) {
    mDrawMarker = drawMarker;
}
public boolean getShouldDrawMarker() {
    return mDrawMarker;
}

@Override
public void dispatchDraw(Canvas canvas) {
    // draw the children of our view 
    super.dispatchDraw(canvas);

    // draw our marker on top of the children if needed
    if (mDrawMarker) {
        // e.g. canvas.drawRect(...) or canvas.drawBitmap(...)
    }
}
这样可以避免向层次结构添加任何额外视图,这意味着您在布局或测量阶段不会受到任何惩罚。如果绘制矩形,请记住重复使用
Paint
Rect
对象