如何使用带有标题的GridLayoutManager而不更改其适配器?

时间:2015-11-16 06:33:15

标签: android android-recyclerview gridlayoutmanager

背景

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

问题

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

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

  3. 使用普通的GridLayoutManager,第一个要求很好:每行可以有不同的高度。但由于#2,它实际上毁了#1。

    问题

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

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

1 个答案:

答案 0 :(得分:0)

好的,所以我仍然使用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,它仍然需要空间。