我希望我ListView
看起来像一个记事本,即带有水平线条背景图案。在记事本示例之后,我可以像这样扩展TextView
和覆盖它onDraw()
:
r = new Rect();
for (int i = 0; i < getLineCount(); i++) {
int baseline = getLineBounds(i, r);
canvas.drawLine(r.left, baseline + 1, r.right, baseline + 1, paint);
}
super.onDraw(canvas);
但是当列表中只有几个元素时,将没有足够的行来填充页面(左侧为实际结果,右侧为所需):
~~~
所以我尝试了另一种方法:覆盖ListView.onDraw()
. 不幸的是,没有直接的方法来计算顶部滚动(getScrollY()
总是返回0
),最重要的是,我必须禁用所有缓存和绘图优化,这肯定会降低性能,除了不能针对大型列表进行扩展。
最后,我的行小部件不是纯文本视图。它们是复杂的布局,即使主要内容是 -sure- a TextView
。这意味着在布局内部我不能调用getLineBounds()
(布局不是文本视图),而在文本视图中我不能因为TextView
小于周围的布局,所以四个边会有间隙。
如何构建一个解决方案来显示我的自定义小部件并用水平线填充整个窗口?一种天真的方法是将虚拟的空元素添加到列表中,只要它适合所有可用空间,但是这是一种技巧,必须有更好的做事方式。使用背景图像不是一种选择,因为线之间的距离必须在运行时可定制。