gridView具有不同的单元大小,pinterest风格

背景

GridView是一个扩展了AdapterView的类,这意味着它可以高效地以网格样式显示单元格,当用户滚动时,回收旧的视图将显示为新的视图。

问题

有时候,你会想得到一个特殊的用户界面,类似于Windows Phone Tiles用户界面,它们之间有不同大小的单元格。

像这样的东西:

AABB AACC AADD AADD 

每个字母代表它的一个单元的一部分,所以单元A是2×4,单元B和单元C每个都是2×1,单元D是2×2。

甚至可能比单元格D稍微高出一点,而在它下面有另一个单元格,所以D的末尾和A的末尾并不需要alignment。

有这种风格的应用程序的例子是pinterest 。

GridView不允许这样的事情。

事实上,我试过的每个解决scheme都有问题。 想问问是否还有其他scheme或更好的解决scheme。

我发现了什么

有多种方法来处理这个问题:

  1. 作为一个扩展AdapterView的类, GridView能够为每个项目使用一个types(使用BaseAdapter ),这将允许您设置如何布局单元格。

    然而,它仍然限制你,因为你会得到的行项目,一个在另一个之下。 你必须让他们alignment。

  2. GridLayout是一个相对较新的布局,而且非常灵活。 谷歌已经发布了一个很好的兼容性库,支持API7及以上。

    但是,它不会使用任何回收的意见,所以如果你想展示很多项目,这是一个不好的select。

    如果您有很多项目,则需要为它们创build所有视图。

  3. QuiltView库 – 从GridLayout扩展,所以基本上有同样的问题。

  4. StaggeredGridView – 看起来最有前途,但有很多错误,尤其是在改变方向时。 这样的错误包括空单元格,滚动不良和NPE(很less但仍然发生)。 我也不确定它是否支持自定义单元格而不是单独的imageViews。

  5. 其他解决scheme,如这里所提到的。

这个问题

有谁知道这个问题的另一种select? 也许一些解决方法,我已经显示的任何解决scheme?


编辑:我认为关于StaggeredGridView,滚动和exception可以通过使用一个正常的ImageView,您可以在getView中设置其大小来解决。 我认为它以奇怪的方式工作的原因是样本更新从互联网加载后的图像视图的大小。

但是,空的单元格问题仍然存在于这个库中。 不仅如此,即使不改变方向,它们的大小也会发生很大的变化。


编辑:现在,我认为最好的解决scheme是使用PinterestLikeAdapterView库

它没有任何问题,我可以find。

但是,它不能使项目采取超过1个单元格宽度。 不过,这很好。

编辑:可悲的是它有notifyDataSetChanged的问题。 我已经在这里报道了。

Solutions Collecting From Web of "gridView具有不同的单元大小,pinterest风格"

回答有点迟了吗?

从etsy检查这个库。 它看起来非常有前途。

https://github.com/etsy/AndroidStaggeredGrid

我认为这是更新版本的https://github.com/maurycyw/StaggeredGridView

更新。

尝试从谷歌改为使用RecyclerView StaggeredGridLayoutManager

  RecyclerView recyclerView = (RecyclerView) findViewById(R.id.recycler_view); recyclerView.setLayoutManager(new StaggeredGridLayoutManager(2, StaggeredGridLayoutManager.VERTICAL)); recyclerView.setItemAnimator(new DefaultItemAnimator()); recyclerView.setAdapter(adapter); 

我认为一个RecyclerView与StaggeredGridLayoutManager可以解决这个问题,如果你想也有一个快速滚动,你可以尝试这个库

所以,不需要更多的技巧,因为Google提供了一个解决scheme。

您可以使用单个ListView完成此操作,其中每个单元格包含不同的网格模板。 我已经做了类似于你所描述的东西,使用这种技术。 如果单元格大小需要是唯一的,这将不起作用,但对于您描述的情况应该足够了:

 AABB AACC AADD AADD 

使用A,B,C,D的各种布局创build一些这样的模板,然后可以将它们随机用作ListView单元格,并且一些简单的偏移math运算可以让您的适配器填充每个子单元来完成如下所示的操作:

 AABB AACC AADD AADD BBBB ACCC ADDD ADDD AAAA BBCC BBCC DDDD AABB AACC AADD AADD AABB AACC DDDD DDDD