[英]Xamarin UICollectionView some cells disappear after scrolling down and back
我有一個UICollectionView的問題,完全與單元格...當我向下和向后滾動所以一些單元格只是空。 他們只是消失了這樣的事情:
我在OrdersView中的ViewDidLoad():
public override void ViewDidLoad()
{
Title = "My Orders..";
base.ViewDidLoad();
ordersCollectionView.Frame = new CGRect(ordersCollectionView.Frame.X, ordersCollectionView.Frame.Y, ordersCollectionView.Frame.Width, ordersCollectionView.Frame.Height);
ordersCollectionView.ScrollEnabled = true;
var layout = new UICollectionViewFlowLayout
{
ItemSize = new CGSize() { Width = ordersCollectionView.Bounds.Width, Height = 80 },
MinimumInteritemSpacing = 0,
MinimumLineSpacing = 2,
ScrollDirection = UICollectionViewScrollDirection.Vertical
};
ordersCollectionView.SetCollectionViewLayout(layout, true);
this.ClearBindings(_source);
_source = new OrdersCollectionViewSource(ordersCollectionView);
this.AddBindings(new Dictionary<object, string>
{
{ _source, "ItemsSource Orders; SelectedItem SelectedOrder; SelectionChangedCommand ShowOrderDetailCommand" }
});
ordersCollectionView.Source = _source;
ordersCollectionView.ReloadData();
Mvx.Resolve<IMvxMessenger>().SubscribeOnMainThread<OrdersLoadedMessage>(mess =>
{
this.ClearBindings(_source);
_source = new OrdersCollectionViewSource(ordersCollectionView);
this.AddBindings(new Dictionary<object, string>
{
{ _source, "ItemsSource Orders; SelectedItem SelectedOrder; SelectionChangedCommand ShowOrderDetailCommand" }
});
ordersCollectionView.Source = _source;
ordersCollectionView.ReloadData();
}, MvxReference.Strong);
InitializeRefreshControl();
ViewMessages.ViewCreatedMessages(this, "OrdersView", ViewModel);
}
OrdersCollectionViewSource:
public class OrdersCollectionViewSource : MvxCollectionViewSource
{
private static readonly NSString CellIdentifier = new NSString("OrdersCollectionViewCell");
public OrdersCollectionViewSource(UICollectionView collectionView) : base(collectionView)
{
collectionView.RegisterClassForCell(typeof(OrdersCollectionViewCell), CellIdentifier);
}
protected override UICollectionViewCell GetOrCreateCellFor(UICollectionView collectionView, NSIndexPath indexPath, object item)
{
var cell = (UICollectionViewCell)collectionView.DequeueReusableCell(CellIdentifier, indexPath);
cell.BackgroundColor = UIColor.FromRGB(237, 237, 237);
return cell;
}
}
OrdersCollectionViewCell:
public class OrdersCollectionViewCell : MvxCollectionViewCell
{
[Export("initWithFrame:")]
public OrdersCollectionViewCell(CGRect frame) : base(frame)
{
Layer.BackgroundColor = new CGColor(220, 25, 25, 255);
//left
var labelName = new UILabel();
labelName.Frame = new CGRect(10f, 15f, (float)(Bounds.Width / 2 + 20), 20f);
labelName.Font = UIFont.PreferredHeadline;
labelName.TextColor = UIColor.FromRGBA(90, 24, 24, 255);
labelName.AutoresizingMask = UIViewAutoresizing.FlexibleWidth | UIViewAutoresizing.FlexibleLeftMargin | UIViewAutoresizing.FlexibleRightMargin;
labelName.Text = "Text";
var labelPickupDate = new UILabel();
labelPickupDate.Frame = new CGRect(10f, 45f, (float)(Bounds.Width / 2 - 10), 20f);
labelPickupDate.Font = UIFont.PreferredBody;
labelPickupDate.TextColor = UIColor.Black;
labelPickupDate.AutoresizingMask = UIViewAutoresizing.FlexibleWidth | UIViewAutoresizing.FlexibleLeftMargin | UIViewAutoresizing.FlexibleRightMargin;
//right
var labelPrice = new UILabel();
labelPrice.Frame = new CGRect((float)(Bounds.Width / 2), 45f, (float)(Bounds.Width / 2 - 10), 20f);
labelPrice.TextAlignment = UITextAlignment.Right;
labelPrice.Font = UIFont.PreferredBody;
labelPrice.TextColor = UIColor.Black;
labelPrice.AutoresizingMask = UIViewAutoresizing.FlexibleWidth | UIViewAutoresizing.FlexibleLeftMargin | UIViewAutoresizing.FlexibleRightMargin;
var labelStatus = new UILabel();
labelStatus.Frame = new CGRect((float)(Bounds.Width / 2), 15f, (float)(Bounds.Width / 2 - 10f), 20f);
labelStatus.TextAlignment = UITextAlignment.Right;
labelStatus.Font = UIFont.PreferredHeadline;
labelStatus.TextColor = UIColor.FromRGBA(15, 113, 10, 255);
labelStatus.AutoresizingMask = UIViewAutoresizing.FlexibleWidth | UIViewAutoresizing.FlexibleLeftMargin | UIViewAutoresizing.FlexibleRightMargin;
Add(labelName);
Add(labelPickupDate);
Add(labelStatus);
Add(labelPrice);
this.DelayBind(() =>
{
var set = this.CreateBindingSet<OrdersCollectionViewCell, Order>();
set.Bind(labelPickupDate).For(q => q.Text).To(vm => vm.PickupDate).WithConversion("StringDateTimeConverter");
set.Bind(labelStatus).For(q => q.Text).To(vm => vm.OrderStatus);
set.Bind(labelPrice).To(vm => vm.Sum).WithConversion("CreditConverter");
set.Apply();
});
}
}
我在這里發現了一些類似的問題,但xcode中的所有內容..所以我嘗試了一些東西,但它仍然無法正常工作。
編輯 - 我的解決方案:
protected override UICollectionViewCell GetOrCreateCellFor(UICollectionView collectionView, NSIndexPath indexPath, object item)
{
var cell = (UICollectionViewCell)collectionView.DequeueReusableCell(CellIdentifier, indexPath);
cell.BackgroundColor = UIColor.FromRGB(237, 237, 237);
var order = (Order) item;
var test = (OrdersCollectionViewCell) cell;
test.labelName.Text = "Name";
test.labelPickupDate.Text = StringConvertor.StringDateTime(order.PickupDate);
test.labelPrice.Text = StringConvertor.PriceConvertor(order.Sum);
test.labelStatus.Text = order.OrderStatus;
return test;
}
我有一個非常相似的問題。 這是因為你的表重用了單元格。 dequeueReusableCellWithIdentifier
將在滾動時重用相同的單元格引用,並且可能無法保留您要顯示的文本。
您的GetOrCreateCellFor
函數包含對DequeueReusableCell
的調用。 您還應該在此函數中設置單元格的文本(例如cell.labelName.text = "my text here"
)。
protected override UICollectionViewCell GetOrCreateCellFor(UICollectionView collectionView, NSIndexPath indexPath, object item)
{
var cell = (UICollectionViewCell)collectionView.DequeueReusableCell(CellIdentifier, indexPath);
cell.BackgroundColor = UIColor.FromRGB(237, 237, 237);
cell.labelName.text = "Your label here"
cell.labelPickupDate.text = "Your pickup date here"
cell.labelPrice.text = "Your price here"
cell.labelStatus.text = "Your status here"
return cell;
}
請參閱下面的答案以獲取完整說明。 如果您有任何疑問,請告訴我。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.