2016-12-28 111 views
2

希望你能提供帮助。我在Visual Studio 2013中使用Xamarin。Xamarin CollectionView突出显示不正确的单元格当滚动

我有一个viewcontroller上的集合视图,它将Web服务中的数据加载到页面上的单元格中。这工作正常,数据在开始时正确显示。

当您滚动列表时,存在单元随机更改颜色的问题。

任何人都可以看到任何明显的事情为什么发生这种情况?我们在这里看到了一些例子(CollectionView Highlights incorrect Cell When Scrolling),但似乎没有涉及到这个具体问题。

我很高兴澄清任何事情。

下面是代码:

的UIViewController

   public partial class UIVCKitchenView : UIViewController 
       { 
       public static readonly EndpointAddress EndPoint = new EndpointAddress(""); 

       private CateringServiceClient _client; 

       public List<KitchenViewWard> wards = new List<KitchenViewWard>(); 

       public UIVCKitchenView (IntPtr handle) : base (handle) 
       { 

       } 

       public override void ViewDidLoad() 
       { 
        base.ViewDidLoad(); 
        InitializeHelloWorldServiceClient(); 
        //todo:pass code from prefrences 
        _client.GetListAsync("01"); 


       } 

       partial void TmpK_TouchUpInside(UIButton sender) 
       {    
       } 

       private static BasicHttpBinding CreateBasicHttp() 
       { 
        BasicHttpBinding binding = new BasicHttpBinding 
        { 
         Name = "basicHttpBinding", 
         MaxBufferSize = 2147483647, 
         MaxReceivedMessageSize = 2147483647 
        }; 
        TimeSpan timeout = new TimeSpan(0, 0, 30); 
        binding.SendTimeout = timeout; 
        binding.OpenTimeout = timeout; 
        binding.ReceiveTimeout = timeout; 
        return binding; 
       } 

       private void InitializeHelloWorldServiceClient() 
       { 
        BasicHttpBinding binding = CreateBasicHttp(); 

        _client = new CateringServiceClient(binding, EndPoint); 
        _client.GetKitchenWardListCompleted += _client_GetKitchenWardListCompleted; 

       } 

       void _client_GetKitchenWardListCompleted(object sender, GetKitchenWardListCompletedEventArgs e) 
       { 
        if (e.Error != null) 
        { 
         BeginInvokeOnMainThread(() => 
         { 
          //Create Alert 
          var okAlertController = UIAlertController.Create("Problem", e.Error.Message, UIAlertControllerStyle.Alert); 
          //Add Action 
          okAlertController.AddAction(UIAlertAction.Create("Ok", UIAlertActionStyle.Default, null)); 
          // Present Alert 
          PresentViewController(okAlertController, true, null); 

         }); 
        } 
        else if (e.Cancelled) 
        { 
         // txtResult.Text = "Request was cancelled."; 
        } 
        else 
        { 

         List<KitchenWardList> _items = new List<KitchenWardList>(e.Result); 
         foreach (KitchenWardList item in _items) 
         { 
          KitchenViewWard _ward = new KitchenViewWard(); 
          _ward.WardName = item.WardName; 
          _ward.WardStatus = item.WardStatus.ToString(); 
          _ward.WardStatusId = Convert.ToInt32(item.WardStatus); 

          wards.Add(_ward); 
         } 

         BeginInvokeOnMainThread(() => 
         { 
          UICVKitchenViewWards.RegisterClassForCell(typeof(UICVCKitchenViewWardsCell), UICVCKitchenViewWardsCell.CellID); 
          UICVKitchenViewWards.Source = new UICVCKitchenViewWardsSource(wards); 
          UICVKitchenViewWards.Delegate = new UICVKitchenViewWardsDelegate();     
         }); 
        } 
       } 

      } 

UICollectionViewSource 类UICVCKitchenViewWardsSource:UICollectionViewSource {

  public UIStoryboard MainStoryboard 
      { 

       get { return UIStoryboard.FromName("Main", NSBundle.MainBundle); } 
      } 

      //Creates an instance of viewControllerName from storyboard 
      public UIViewController GetViewController(UIStoryboard storyboard, string viewControllerName) 
      { 
       return storyboard.InstantiateViewController(viewControllerName); 
      } 


      public List<KitchenViewWard> rows { get; set; } 

      public UICVCKitchenViewWardsSource(List<KitchenViewWard> _rows) 
      { 
       rows = _rows; 
      } 

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

      public override nint GetItemsCount(UICollectionView collectionView, nint section) 
      {   
       return rows.Count; 
      } 

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

      public override void ItemHighlighted(UICollectionView collectionView, NSIndexPath indexPath) 
      { 
       var cell = (UICVCKitchenViewWardsCell)collectionView.CellForItem(indexPath); 
       //cell.BackgroundColor = UIColor.Yellow; 
      } 

      public override void ItemUnhighlighted(UICollectionView collectionView, NSIndexPath indexPath) 
      { 

       //var renderer = Platform.GetRenderer(page); 

       var cell = (UICVCKitchenViewWardsCell)collectionView.CellForItem(indexPath); 
       var UIVCKitchenViewController = GetViewController(MainStoryboard, "UIVCKitchenView"); 
       UIVCKitchenViewController.PerformSegue("seqShowKitchenDetails", this); 

       //cell.BackgroundColor = UIColor.Orange; 
      } 

      public override void ItemSelected(UICollectionView collectionView, NSIndexPath indexPath) 
      { 
       var cell = (UICVCKitchenViewWardsCell)collectionView.CellForItem(indexPath); 
       var UIVCKitchenViewController = GetViewController(MainStoryboard, "UIVCKitchenView"); 
       UIVCKitchenViewController.PerformSegue("seqShowKitchenDetails", this); 
      } 

      public override UICollectionViewCell GetCell(UICollectionView collectionView, NSIndexPath indexPath) 
      {    
       var cell = (UICVCKitchenViewWardsCell)collectionView.DequeueReusableCell(UICVCKitchenViewWardsCell.CellID, indexPath); 
       cell.updateCell(rows[indexPath.Row]); 

       return cell; 
      } 

     } 

UICollectionViewCell

public partial class UICVCKitchenViewWardsCell : UICollectionViewCell 
    { 
    public UILabel wardName; 
    public static NSString CellID = new NSString("UICVCKitchenViewWardsCell"); 

      [Export("initWithFrame:")] 
      public UICVCKitchenViewWardsCell(CGRect frame) 
       : base(frame) 
      { 
       ContentView.BackgroundColor = new UIColor(225f/255f, 225f/255f, 225f/255f, 1f); 
       ContentView.Layer.BorderWidth = 1.0f; 
       ContentView.Layer.BorderColor = new CGColor(0f/255f, 134f/255f, 255f/255f); 

       wardName = new UILabel();    
       ContentView.AddSubviews(new UIView[] { wardName }); 
      } 

      public void updateCell(KitchenViewWard ward) 
      { 
       wardName.Text = ward.WardName;    
       wardName.Frame = new CGRect(10, 25, ContentView.Bounds.Width - 20, 21); 

       switch (ward.WardStatusId) 
       { 
        case (int)WardOrderStatus.InProcess: 
         ContentView.BackgroundColor = new UIColor(255f/255f, 204f/255f, 0f/255f, 1f); 
         break; 
        case (int)WardOrderStatus.Loaded: 
         ContentView.BackgroundColor = new UIColor(255f/255f, 149f/255f, 0f/255f, 1f); 
         break; 
        case (int)WardOrderStatus.Nostatus: 
         break; 
        case (int)WardOrderStatus.OrderSent: 
         ContentView.BackgroundColor = new UIColor(90f/255f, 200f/255f, 250f/255f, 1f); 
         break; 
        case (int)WardOrderStatus.Served: 
         ContentView.BackgroundColor = new UIColor(76f/255f, 217f/255f, 100f/255f, 1f); 

         break; 

        default: 
         break; 
       } 
      } 
     } 

回答

1

在你的UITableViewCell子类中重写,请与prepareForReuse()背景颜色设置为白色或任何你的默认值是。

UITableViewCells被重用,所以当它们已经分配了一个颜色时,你会得到一个已经被上色而不是“新鲜”的单元格。

相关问题