RecyclerView SpanSizeLookup-大数据集性能惊人



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

然而,我注意到,适配器中的项目越多,性能就会严重降低。我已经对此进行了分析,它是100%的,因为在自定义查找中使用了GetSpanSize。这是一个基本函数,但在滚动时,似乎会为每一帧上的每一项调用它。果不其然,如果我去掉我的查找,无论我有多少项,性能都很好。作为一个用例,这可能是数千个项目。我开始看到性能问题后,也许1000项目。

从安卓的角度来看,这听起来效率非常低。我到处找其他有这个问题的人,但似乎什么都找不到。

有什么想法吗?

谢谢,

编辑:添加了代码,但是即使我只是返回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;
}

问题是您没有覆盖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相同的性能。

最新更新