Android动态计算列数

时间:2011-12-09 11:32:15

标签: android layout adapter dynamic-columns

我有一个动态创建的项目列表,这些项目应该显示在两列或一列中,具体取决于包含文本所需的空间,例如:如果文本很长,则每行只有一个项目,否则为两个。显然它们应该都是相同的尺寸(屏幕尺寸的一半)。

据我所知,没有标准的Android视图使用适配器来做到这一点。使用GridView,您可以拥有多个列,但不能将某些行设置为一列,而将其他行设置为两列。 TableLayout可以拉伸视图,但是在这里你必须知道每行需要多少列。此外,它没有适配器。

所以我想知道a)是否有任何我失去的支持,支持这样的事情或b)这个问题最简单的解决方案是什么?

编辑:这些项目还包含一个CheckBox,我需要跟踪已检查状态,因此我无法使用适配器在一个视图中放置两个项目。

2 个答案:

答案 0 :(得分:1)

我认为这是使用标准组件解决的难题,因为将数据映射到行到了行的问题。

例如,如果您使用带有Cursor行的x来向适配器提供数据,那么从Adapter看到的总项数也是x。但是,由于您有条件地将两个项目映射到同一行,这意味着ListView会在y中看到Adapter行,其中y <= x。但是你不能轻易地从一开始就知道y会是什么。此外,如果ListView询问Adapter项目i,其中0&lt; = i&lt; y,Adapter没有(简单)方法来确定Cursori将映射到哪些元素。

话虽这么说,一个可行的解决方案是子类AdapterViewListView并自己实现元素的布局。当您从Adapter获取每个项目时,您将根据周围适配器项目的大小来测量和布局它。

如果您没有大量元素,可以使用的另一种解决方案是使用两个自定义Adapter,一个名为ItemAdapter,另一个名为RowAdapterItemAdapter会根据(推测的)Cursor对实际项目进行膨胀。 RowAdapter将使用ItemAdapter获取商品并将其合并到行中。 ListView将依次使用RowAdapter。问题是要知道RowAdapter将产生多少行,有必要在ItemAdapter连接到RowAdapter之前衡量ListView中的所有项目。< / p>

答案 1 :(得分:0)

据我所知,您的问题没有现成的解决方案。我还没有尝试过这样的东西,但我会使用LinearLayout作为列表项。然后创建自己的Deflater(例如CursorAdapter)来缩小Layout并检查长度。如果需要,您应该能够向LinearLayout添加新的视图(例如TextView)。