设置-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;
}
答案 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相同的性能。