1

バックグラウンド

グリッドのような方法でアイテムのリストを表示するアプリがありますが、正確ではありません...

問題

  1. 一部のアイテムは高さが異なるため、近くにあるアイテムは同じ高さになるはずです。これは GridLayoutManager で動作します。

  2. 一部のアイテム (実際には私の場合は最初のアイテムのみ) は行全体にまたがる必要があります (これが StaggeredGridLayoutManager を使用した理由です)。

通常の GridLayoutManager を使用すると、最初の要件はうまく機能しました。つまり、各行の高さが異なる可能性があります。しかし、#2のせいで、実際には#1を台無しにしました。

質問

StaggeredGridLayoutManager を使用して、アイテムの高さが異なる場合に Y 座標で動かないようにすることはできますか?

私は考えていました: NestedScrollView と GridLayoutManager を使用できるかもしれません (最初のアイテムのみがスパンされているため) が、残りのケース (およびこのソリューション) で可能かどうかを知りたいです。

4

1 に答える 1

1

OK、まだ GridLayoutManager を使用して可能な解決策を見つけました。

  • getItemViewTypeを使用して、スパンされたアイテムに対して特定の値を返し、通常のアイテムに対して別の値を返します。

  • タイプに応じてonCreateViewHolderで必要なビューを作成し、タイプに応じてonBindViewHolderで必要な viewHolder クラスにキャストします。

  • setSpanSizeLookupを使用し、 getSpanSize内で、タイプがそのような項目の場合にスパンされたセルを返します

例:

  @Override
  public int getItemViewType(final int position)
    {
    return position==0?VIEW_TYPE_HEADER:VIEW_TYPE_NORMAL;
    }

  public ViewHolder onCreateViewHolder(final ViewGroup parent,final int viewType)
    {
    if(viewType==VIEW_TYPE_HEADER) ... //create header ViewHolder
    else ... // create normal item
    }


...
  _layoutManager=new GridLayoutManager(...,3,LinearLayoutManager.VERTICAL,false);
  _layoutManager.setSpanSizeLookup(new SpanSizeLookup()
      {
      @Override
      public int getSpanSize(final int position)
        {
        return _adapter.getItemViewType(position)==VIEW_TYPE_HEADER?_layoutManager.getSpanCount():1;
        }
      });

それでも、NestedScrollView ソリューションの使用方法を知りたい

私が気づいた 1 つの問題は、ヘッダーの可視性を GONE に設定しようとすると、まだスペースが必要なことです。

于 2015-11-16T23:04:51.577 に答える