2011-12-09 66 views
0

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

据我所知没有标准的Android视图与适配器,这样做。有了GridView,你可以有多列,但不是一列一列,有的两列。 TableLayout可以扩展视图,但在这里你必须知道每行需要多少列。另外它没有适配器。

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

编辑:项目还包含一个复选框,我需要保持选中状态的跟踪,所以我不能只是把两个项目在一个视图中使用的适配器。

+0

您的意思是每个项目应该由适配器生成,如果一个项目足够窄,下一个项目将在同一行上?如果是这样,如果项目0很窄,项目1是宽的,项目2是窄的,所有项目应该在不同的行上?或者你的意思是每个项目都有两位数据,如果其中的一个位太宽,只有一位可见? –

+0

是的,这是第一个选项。而要求是,如果项目1宽,它应该在下一行,或者如果项目0是宽项目1应该在下一行。 –

回答

0

据我所知,没有现成的解决方案来解决您的问题。我还没有尝试过这样的事情,但我会使用LinearLayout作为列表项。然后创建自己的Deflater(例如CursorAdapter)来缩小布局并检查长度。如果需要,你应该可以添加一个新的View(例如TextView)到LinearLayout。

+0

嗯是的。问题在于它不仅仅是一个TextView。它是一个带有文本的复选框,我也需要跟踪选中的项目。所以理想情况下,每个项目都有一个观点。 –

+0

另一个想法:只需创建两列并将其中一个设置为可见性即可:如果不需要,请将其删除。 TextView只是一个例子。如果将复杂的布局封装到另一个布局中,则可以将其添加到LinearLayout。 – Mark

+0

它可能适用于我。我会试一试。如果这有效,我想这是最简单的解决方案..其他一切只是在代码中添加视图。 –

1

我想说这是一个用标准组件解决的难题,这是由于将数据映射到项目到行的问题。

比如你使用Cursorx行的数据,那么总项目计数从Adapter看到喂适配器也是x。但是,由于您有条件地将两个项目映射到同一行,这意味着ListView将在Adapter中看到y行,其中y <= x。但是,从一开始你就不会轻易地知道y会是什么。此外,如果ListViewAdapter询问其中 = i < y,那么Adapter将不存在(容易的)方式来确定i将映射到的Cursor中的哪些元素。

也就是说,一个可行的解决方案是继承AdapterViewListView并自己实现元素的布局。当您从Adapter获取每件物品时,您将根据周围适配器物品的尺寸来测量和布置它。

不同的解决方案,它可以为你工作,如果你没有大量的要素之一是使用两个自定义Adapter S,一个叫ItemAdapter和一个叫RowAdapterItemAdapter将根据(推定的)Cursor夸大实际项目。 RowAdapter将使用ItemAdapter获取项目并将其合并到行中。 ListView将依次使用RowAdapter。问题是要知道RowAdapter将产生多少行,在RowAdapter连接到ListView之前,有必要测量ItemAdapter中的所有项目。

+0

这听起来像是一个更好的解决方案。现在我只需检查每行是否已显示该项目,否则我将该行设置为不可见。这对我很有用,因为一旦用户单击屏幕上的OK按钮,我只需知道CheckBox的状态。 –