GridView は AdapterView を拡張するクラスです。つまり、グリッドスタイルでセルを表示します効率的に、ユーザーがスクロールしたときに古いビューが新しいビューとして表示されるようにリサイクルします。
場合によっては、Windows Phone Tiles UIに似た、さまざまなサイズのセルが互いに重なり合う特別なUIを取得する必要があります。
このようなもの:
AABB
AACC
AADD
AADD
各文字はそのセルの一部を表すため、セルAは2x4、セルBとセルCはそれぞれ2x1、セルDは2x2です。
セルDが表示したものより少し上で終了し、そのすぐ下に別のセルがあるため、Dの終わりとAの終わりを合わせる必要はありません。
このスタイルのアプリの例は pinterest です。
GridViewはそのようなことを許可しません。
実際、私が試したすべてのソリューションには問題があります。他の選択肢やより良い解決策があるかどうかを尋ねたいです。
この問題を処理する方法は複数あります。
AdapterViewGridViewを拡張するクラスとして( BaseAdapter を使用して)各アイテムのタイプを持つ機能があり、レイアウト方法を設定できますセル。
ただし、アイテムの行が上下に並んで表示されるため、依然として制限されます。それらを整列させる必要があります。
GridLayout は比較的新しいレイアウトであり、非常に柔軟です。 Googleは、API7以降をサポートするNice互換性ライブラリを公開しています。
ただし、ビューのリサイクルは使用しないため、多くのアイテムを表示したい場合には適切ではありません。
多数のアイテムがある場合は、それらのすべてのビューを作成する必要があります。
QuiltView Library -GridLayoutから拡張されるため、基本的に同じような問題があります。
StaggeredGridView -最も有望に見えますが、特に方向を変更するときに多くのバグがあります。このようなバグには、空のセル、スクロール不良、NPEが含まれます(まれですが、まだ発生しています)。また、imageViewsだけではなく、カスタマイズされたセルをサポートするかどうかもわかりません。
言及されている他のソリューション here .
誰もこの問題の別の選択肢を知っていますか?おそらく、私が示したソリューションのいずれかの回避策はありますか?
編集:StaggeredGridViewについて、getView内でサイズを設定した通常のImageViewを使用することで、スクロールと例外を解決できると思います。奇妙な方法で動作する理由は、サンプルがインターネットから読み込まれた後にimageviewのサイズを更新するからだと思います。
ただし、このライブラリには空のセルの問題が残っています。それだけでなく、向きを変えなくても、サイズは大きく変わります。
編集:今のところ、最善の解決策は、 PinterestLikeAdapterView library を使用することだと思います。
見つけることができる問題はありません。
ただし、アイテムのセル幅を1つより大きくすることはできません。それにもかかわらず、それは非常に良いです。
編集:悲しいことに、notifyDataSetChangedに問題があります。私はそれについて報告しました here .
RecyclerView で StaggeredGridLayoutManager を使用すると、この問題を解決できると思います。高速スクロール機能がある場合は、 このライブラリ を試すことができます。
したがって、Googleがソリューションを提供したため、これ以上のトリックは必要ありません...
答えるのに少し遅れていますか?
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);
各セルに異なるグリッドテンプレートが含まれる単一のListViewでこれを実現できる場合があります。このテクニックを使用して、あなたが説明しているものに似た何かをしました。セルサイズを一意にする必要がある場合、これは機能しませんが、説明したケースでは十分なはずです。
AABB
AACC
AADD
AADD
A、B、C、Dのさまざまな配置で、このような少数のテンプレートを作成すると、それらをListViewセルとしてランダムに使用でき、いくつかの単純なオフセット計算により、アダプターが各サブセルに入力して次のようなことを実現できます:
AABB
AACC
AADD
AADD
BBBB
ACCC
ADDD
ADDD
AAAA
BBCC
BBCC
DDDD
AABB
AACC
AADD
AADD
AABB
AACC
DDDD
DDDD