2012-03-11 207 views
3

我想在我的ListView上绘制一个叠加层。所以我采用了最明显的方法,并将我的自定义绘图代码放在我的ListView子类的super.onDraw(canvas)下面。自定义列表视图图

令我惊讶的是,该列表呈现在我的自定义绘图之上。我知道这很容易通过将ListView包装在FrameLayout中完成,但我认为膨胀另一个视图并不是必须的。一个修复和解释为什么我遇到这个问题将是真棒,谢谢!

我抽奖代码看起来是这样的:

@Override 
protected void onDraw(Canvas canvas) { 
    super.onDraw(canvas); 
    canvas.drawRect(rect, paint); 
} 

回答

6

有关ListView控件的事情是,它不是实际绘制列表内容。这由绑定到列表的Adapter处理 - 或者更具体地说,由该Adapter填充ListView创建的视图。

ListView的onDraw发生在包含的视图被创建和显示之前。

在ListView之上绘制东西可能很昂贵,因为您正在合成已经复杂的View上的另一个图层。将另一个视图置于顶部(根据您的建议使用FrameLayout)可能是您尝试做什么的“最佳”方式,或者(取决于您尝试实现的效果),您可以修改适配器或视图显示您要覆盖的数据。

4

重写dispatchDraw而不是onDraw似乎做你想要什么:

@Override 
protected void dispatchDraw(Canvas canvas) { 
    super.dispatchDraw(canvas); 
    ... 
} 
+0

这就是我一直在寻找! – themarshal 2015-11-09 21:41:42