1

背景

我有一个应用程序,它以类似网格的方式显示项目列表,但不完全是......

问题

  1. 有些物品的高度不同,因此靠近它们的物品应该获得与它们相同的高度。这个适用于 GridLayoutManager。

  2. 有些项目(在我的例子中实际上只有第一个)需要跨越整行(这就是我使用 StaggeredGridLayoutManager 的原因)。

使用普通的 GridLayoutManager,第一个要求可以正常工作:每一行可以有不同的高度。但是因为#2,它实际上毁了#1。

问题

是否可以使用 StaggeredGridLayoutManager 以便当项目具有不同的高度时,它不会使它们在 Y 坐标中移动?

我在想:也许我可以使用 NestedScrollView 和 GridLayoutManager (因为只有第一个项目是跨越的),但我仍然想知道在其他情况下是否可能(以及这个解决方案)。

4

1 回答 1

1

好的,所以我仍然使用 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 解决方案

我注意到的一个问题是,如果我尝试将标题的可见性设置为 GONE,它仍然会占用空间。

于 2015-11-16T23:04:51.577 回答