RecyclerView SpanSizeLookup-大数据集的可怕性能

时间:2018-07-17 16:57:05

标签: android android-recyclerview xamarin.android gridlayoutmanager

设置-RecyclerView / GridLayoutManager /自定义SpanSizeLookup。没什么不寻常的,它只是一个带有跨越整个宽度的标题的网格。

但是,我注意到的是,性能会严重降低适配器中越来越多的物品的性能。我已经对此进行了分析,由于自定义查找中存在GetSpanSize,所以它是100%。这是一个基本功能,但滚动时似乎为每帧上的每个项目都调用了它。果然,如果我进行查找,无论我拥有多少物品,性能都很好。作为一个用例,可能有数千个项目。大约有1000个项目之后,我开始看到性能问题。

从Android的角度来看,这听起来效率极低。我在高空搜寻其他人遇到此问题,但似乎找不到任何东西。

有什么想法吗?

谢谢

编辑:添加了代码,但是即使我只返回1而不是进行实际查找,这种情况仍然会发生。这个问题似乎是因为滚动时列表每次移动时,适配器中的每个项目都会调用它。

public class SpanSizeLookup : GridLayoutManager.SpanSizeLookup
{
    //
    private GridLayoutManager LayoutManager;
    private MyItemAdapter ItemAdapter;
    //

    // SpanSizeLookup
    public SpanSizeLookup( GridLayoutManager layoutManager, MyItemAdapter itemAdapter )
    {
        LayoutManager = layoutManager;
        ItemAdapter = itemAdapter;
    }

    // GetSpanSize
    public override int GetSpanSize( int position )
    {
        switch ( ItemAdapter.GetItemViewType( position ) )
        {
            case TYPE_HEADER:
                return LayoutManager.SpanCount;
            case TYPE_ITEM:
                return 1;
        }

        return -1;
    }
}

// GetItemViewType
public override int GetItemViewType( int position )
{
    if ( ItemList[ position ].GUID.Equals( Guid.Empty ) )
        return TYPE_HEADER;

    return TYPE_ITEM;
}

1 个答案:

答案 0 :(得分:0)

问题是您还没有覆盖GetSpanIndex。 DefaultSpanSizeLookup本质上是这个

public class DefaultSpanSizeLookup : GridLayoutManager.SpanSizeLookup
{
   public int GetSpanSize(int position) 
   {
      return 1;
   }

   public int GetSpanIndex(int position, int spanCount) 
   {
      return position % spanCount;
   }
}

如果使用相同的值覆盖GetSpanIndex,则将获得与使用DefaultSpanSizeLookup相同的性能。