如何从GetCell方法UICollectionView跳过单元格/返回无单元格

时间:2017-03-15 23:02:27

标签: ios xamarin xamarin.ios uicollectionview

我已经获得了TagInstances'每个都包含一个颜色'字符串值。

List<TagInstance> tags

在我的UICollectionView中,我想放弃tagCells的初始化,如果:

tags[index.Path].color = "undefined"

我试图在&#34; cellForItemAtIndexPath&#34; /&#34; GetCell&#34;方法:

[Export("collectionView:cellForItemAtIndexPath:")]
public UICollectionViewCell GetCell(UICollectionView collectionView, NSIndexPath indexPath)
{
    var cell = (TagCell)collectionView.DequeueReusableCell("tagCell", indexPath);

    var thisTag = tags[indexPath.Row];

    if (thisTag.color == "undefined") { /* todo: Skip over this cell somehow */ }

    try
    {
        var color = UIColor.Clear.FromHex(thisTag.color);

        cell.SetUIWithData(color, thisTag.abbreviation);

        cell.AddBorderAndShadow();
    }
    catch (Exception ex)
    {
        System.Diagnostics.Debug.WriteLine($"\ncolor : { thisTag.color }\nThrows an exception : \n{ ex }\n");
    }

    return cell;
}

目前我的集合视图显示有任何TagInstance具有未定义颜色的间隙。我希望这个系列没有那个差距。这可能吗?

2 个答案:

答案 0 :(得分:3)

正如rmaddy和SushiHangover所说,正确的方法是拥有正确的数据源,只有你想要显示的项目。

在某种程度上,替代方法是将这些不需要的单元格调整为宽度/高度= 0.要使用UICollectionView,必须从UICollectionViewFlowLayout派生并覆盖LayoutAttributesForElementsInRect方法然后返回Size = CGSize.Empty对于那些你不想看的元素。

请参阅Xamarin Docs in Introduction to UICollectionView中的子类化UICollectionViewFlowLayout 部分。

同样,正确而简单的方法是在数据源级别过滤元素,如SushiHangover和rmaddy所建议。

答案 1 :(得分:1)

1)从您不想在collectionview中显示单元格的数据源中删除该数据。

tags.RemoveAll(p => p.color== "undefined" );

2)如果由于其他原因想要将该数据保留在列表中,请使用UICollectionViewDelegateFlowLayout的GetSizeForItem方法。

在UICollectionviewSource中使用以下

[Export ("collectionView:layout:sizeForItemAtIndexPath:"), CompilerGenerated]
public virtual CGSize GetSizeForItem (UICollectionView collectionView, UICollectionViewLayout layout, NSIndexPath indexPath)
{
var thisTag = tags[indexPath.Row];

if (thisTag.color == "undefined")
        return new CGSize(0,0);
else 
    return new CGSize (yoruwidth, yourheigh);
}