web-dev-qa-db-ja.com

異なるセルサイズ、pinterestスタイルのgridView

バックグラウンド

GridViewAdapterView を拡張するクラスです。つまり、グリッドスタイルでセルを表示します効率的に、ユーザーがスクロールしたときに古いビューが新しいビューとして表示されるようにリサイクルします。

問題

場合によっては、Windows Phone Tiles UIに似た、さまざまなサイズのセルが互いに重なり合う特別なUIを取得する必要があります。

このようなもの:

AABB
AACC
AADD
AADD

各文字はそのセルの一部を表すため、セルAは2x4、セルBとセルCはそれぞれ2x1、セルDは2x2です。

セルDが表示したものより少し上で終了し、そのすぐ下に別のセルがあるため、Dの終わりとAの終わりを合わせる必要はありません。

このスタイルのアプリの例は pinterest です。

GridViewはそのようなことを許可しません。

実際、私が試したすべてのソリューションには問題があります。他の選択肢やより良い解決策があるかどうかを尋ねたいです。

私が見つけたもの

この問題を処理する方法は複数あります。

  1. AdapterViewGridViewを拡張するクラスとして( BaseAdapter を使用して)各アイテムのタイプを持つ機能があり、レイアウト方法を設定できますセル。

    ただし、アイテムの行が上下に並んで表示されるため、依然として制限されます。それらを整列させる必要があります。

  2. GridLayout は比較的新しいレイアウトであり、非常に柔軟です。 Googleは、API7以降をサポートするNice互換性ライブラリを公開しています。

    ただし、ビューのリサイクルは使用しないため、多くのアイテムを表示したい場合には適切ではありません。

    多数のアイテムがある場合は、それらのすべてのビューを作成する必要があります。

  3. QuiltView Library -GridLayoutから拡張されるため、基本的に同じような問題があります。

  4. StaggeredGridView -最も有望に見えますが、特に方向を変更するときに多くのバグがあります。このようなバグには、空のセル、スクロール不良、NPEが含まれます(まれですが、まだ発生しています)。また、imageViewsだけではなく、カスタマイズされたセルをサポートするかどうかもわかりません。

  5. 言及されている他のソリューション here .

質問

誰もこの問題の別の選択肢を知っていますか?おそらく、私が示したソリューションのいずれかの回避策はありますか?


編集:StaggeredGridViewについて、getView内でサイズを設定した通常のImageViewを使用することで、スクロールと例外を解決できると思います。奇妙な方法で動作する理由は、サンプルがインターネットから読み込まれた後にimageviewのサイズを更新するからだと思います。

ただし、このライブラリには空のセルの問題が残っています。それだけでなく、向きを変えなくても、サイズは大きく変わります。


編集:今のところ、最善の解決策は、 PinterestLikeAdapterView library を使用することだと思います。

見つけることができる問題はありません。

ただし、アイテムのセル幅を1つより大きくすることはできません。それにもかかわらず、それは非常に良いです。

編集:悲しいことに、notifyDataSetChangedに問題があります。私はそれについて報告しました here .

35

RecyclerViewStaggeredGridLayoutManager を使用すると、この問題を解決できると思います。高速スクロール機能がある場合は、 このライブラリ を試すことができます。

したがって、Googleがソリューションを提供したため、これ以上のトリックは必要ありません...

5

答えるのに少し遅れていますか?

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);
17
Krit

各セルに異なるグリッドテンプレートが含まれる単一の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
0
Graham