集合视图中的单元大小未更改IOS(在Xamarin中实现)

时间:2018-02-10 04:18:41

标签: ios xamarin xamarin.ios uicollectionview

我有一个集合视图,需要让单元格符合内容大小。 我使用sizeForItemAtIndexPath:来设置每个单元格的大小。 它被解雇并且效果很好。

这是我面临的问题。 集合视图的数据列表是动态更改的。

  • 集合视图只有一个要显示的项目,并以正确的单元格大小显示(假设 size1
  • 下次收集视图有1项要再次显示,但它是不同的数据。

在这种情况下,集合视图不会以正确的单元格大小显示它。它以 size1 显示 我想以自己的大小显示下一个项目,但集合视图保持原始大小。 更改项目计数后,将再次触发sizeForItemAtIndexPath:。 当项目计数相同时,它不会被触发。

我希望每次都被解雇。

我分享了一些代码。

cllSelected.Source = new SelectedItemSource(this, _selectedItems);

只要有新的_selectedItems

,就会调用上面的代码

我实施了UICollectionViewSource,如下所示

public class SelectedItemSource : UICollectionViewSource, IUICollectionViewDelegateFlowLayout
    {
        CatalogVC _ownerVC;
        SelectedCategoryList _selectedItems;

        public SelectedItemSource(CatalogVC ownerVC, SelectedCategoryList selectedItems)
        {
            _ownerVC = ownerVC;
            _selectedItems = selectedItems;
        }

        public override nint NumberOfSections(UICollectionView collectionView)
        {
            return 1;
        }

        public override nint GetItemsCount(UICollectionView collectionView, nint section)
        {
            return _selectedItems != null ? _selectedItems.Count : 0;
        }

        public override bool ShouldHighlightItem(UICollectionView collectionView, Foundation.NSIndexPath indexPath)
        {
            return true;
        }

        public override void ItemHighlighted(UICollectionView collectionView, Foundation.NSIndexPath indexPath)
        {

        }

        public override void ItemUnhighlighted(UICollectionView collectionView, Foundation.NSIndexPath indexPath)
        {
            _ownerVC.SelectedFilter_ItemClick(indexPath.Row);
        }

        public override UICollectionViewCell GetCell(UICollectionView collectionView, Foundation.NSIndexPath indexPath)
        {
            SelectedFilterCollectionCell cell = collectionView.DequeueReusableCell("SelectedFilterCollectionCell", indexPath) as SelectedFilterCollectionCell;
            cell.Layer.ShouldRasterize = true;
            cell.Layer.RasterizationScale = UIScreen.MainScreen.Scale;

            cell.BindDataToCell(_selectedItems[indexPath.Row]);

            return cell;
        }

        [Export("collectionView:layout:sizeForItemAtIndexPath:")]
        public CoreGraphics.CGSize GetSizeForItem(UICollectionView collectionView, UICollectionViewLayout layout, Foundation.NSIndexPath indexPath)
        {
            var text = new NSString(_selectedItems[indexPath.Row].Text);
            CGSize cellSize = new CGSize(xxx, yyy); // cellSize will be determined according to text

            return cellSize;
        }
    }

感谢任何解决方案或建议!

1 个答案:

答案 0 :(得分:0)

尝试在数据更改后调用CollectionView.ReloadData()

我认为它会调用委托中包含的方法。