【发布时间】:2013-09-04 15:33:00
【问题描述】:
背景
GridView 是一个扩展 AdapterView 的类,这意味着它可以有效地以网格样式显示单元格,在用户滚动时回收旧视图以显示为新视图。
问题
有时,您可能希望获得一个特殊的 UI,它类似于 Windows Phone Tiles UI,具有不同大小的单元格。
类似这样的:
AABB
AACC
AADD
AADD
每个字母代表其单元格的一部分,因此单元格 A 为 2x4 ,单元格 B 和单元格 C 各取 2x1 ,单元格 D 为 2x2 。
可能还不止于此,单元格 D 的完成位置略高于我所展示的内容,而在它的正下方有另一个单元格,因此 D 的结尾和 A 的结尾不需要对齐。
具有这种风格的应用示例是pinterest。
GridView 不允许这样的事情。
事实上,我尝试过的每个解决方案都有问题。想问问有没有其他替代方案或更好的解决方案。
我发现了什么
有多种方法可以处理这个问题:
-
作为扩展AdapterView 的类,GridView 能够为每个项目指定一个类型(使用BaseAdapter),这将允许您设置单元格的布局方式。
但是,它仍然会限制你,因为你会得到一排排的项目,一个在另一个之下。你必须让它们对齐。
-
GridLayout 是一个相对较新的布局,而且非常灵活。 Google 为其发布了一个很好的兼容性库,支持 API7 及更高版本。
但是,它不使用任何视图回收,因此如果您希望显示很多项目,这是一个糟糕的选择。
如果您有很多项目,则需要为它们创建所有视图。
QuiltView Library - 继承自GridLayout,所以基本上有同样的问题。
StaggeredGridView - 看起来最有前途,但有很多错误,尤其是在改变方向时。此类错误包括空单元格、不良滚动和 NPE(很少见但仍然会发生)。我也不确定它是否支持自定义单元格而不是单独的 imageViews。
其他解决方案,如提及here。
问题
有人知道这个问题的另一种替代方法吗?对于我展示的任何解决方案,也许有一些解决方法?
编辑:我认为关于 StaggeredGridView ,滚动和异常可以通过使用您在 getView 中设置其大小的普通 ImageView 来解决。我认为它以一种奇怪的方式工作的原因是样本在从互联网加载后更新了 imageview 的大小。
然而,空单元问题仍然存在于这个库中。不仅如此,即使不改变方向,它们的大小也会发生很大变化。
编辑:目前,我认为最好的解决方案是使用 PinterestLikeAdapterView library。
我找不到任何问题。
但是,它不能使项目占用超过 1 个单元格宽度。不过还是很不错的。
编辑:遗憾的是 notifyDataSetChanged 存在问题。我已经举报了here。
【问题讨论】:
-
我强烈推荐 this 双同步 ListView 库。它比使用 GridView 更高效
-
@bZea 我已经提到过这个解决方案(列表中的#5)。它有很多问题。它不能对所有项目使用单个适配器。它不是流畅的(一个接一个地滚动列表视图),也不是可定制的(无法设置列数)。
标签: android android-gridview cells android-adapterview android-gridlayout