我有一个动态创建的项目列表,这些项目应该显示在两列或一列中,具体取决于包含文本所需的空间,例如:如果文本很长,则每行只有一个项目,否则为两个。显然它们应该都是相同的尺寸(屏幕尺寸的一半)。
据我所知,没有标准的Android视图使用适配器来做到这一点。使用GridView,您可以拥有多个列,但不能将某些行设置为一列,而将其他行设置为两列。 TableLayout可以拉伸视图,但是在这里你必须知道每行需要多少列。此外,它没有适配器。
所以我想知道a)是否有任何我失去的支持,支持这样的事情或b)这个问题最简单的解决方案是什么?
编辑:这些项目还包含一个CheckBox,我需要跟踪已检查状态,因此我无法使用适配器在一个视图中放置两个项目。
答案 0 :(得分:1)
我认为这是使用标准组件解决的难题,因为将数据映射到行到了行的问题。
例如,如果您使用带有Cursor
行的x
来向适配器提供数据,那么从Adapter
看到的总项数也是x
。但是,由于您有条件地将两个项目映射到同一行,这意味着ListView
会在y
中看到Adapter
行,其中y <= x
。但是你不能轻易地从一开始就知道y
会是什么。此外,如果ListView
询问Adapter
项目i,其中0&lt; = i&lt; y,Adapter
没有(简单)方法来确定Cursor
中i
将映射到哪些元素。
话虽这么说,一个可行的解决方案是子类AdapterView
或ListView
并自己实现元素的布局。当您从Adapter
获取每个项目时,您将根据周围适配器项目的大小来测量和布局它。
如果您没有大量元素,可以使用的另一种解决方案是使用两个自定义Adapter
,一个名为ItemAdapter
,另一个名为RowAdapter
。 ItemAdapter
会根据(推测的)Cursor
对实际项目进行膨胀。 RowAdapter
将使用ItemAdapter
获取商品并将其合并到行中。 ListView
将依次使用RowAdapter
。问题是要知道RowAdapter
将产生多少行,有必要在ItemAdapter
连接到RowAdapter
之前衡量ListView
中的所有项目。< / p>
答案 1 :(得分:0)
据我所知,您的问题没有现成的解决方案。我还没有尝试过这样的东西,但我会使用LinearLayout作为列表项。然后创建自己的Deflater(例如CursorAdapter)来缩小Layout并检查长度。如果需要,您应该能够向LinearLayout添加新的视图(例如TextView)。