2016-12-28 2 views
2

Надеюсь, вы сможете помочь. Я использую Xamarin для Visual Studio 2013.Xamarin CollectionView Признаки неправильной ячейки при прокрутке

У меня есть вид коллекции на viewcontroller, который загружает данные из веб-службы в ячейки на странице. Это прекрасно работает, и данные отображаются правильно в начале.

Существует проблема, при которой ячейки случайно меняют цвет при прокрутке списка.

Может ли кто-нибудь увидеть что-нибудь очевидное, почему это происходит? Мы видели примеры здесь (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 использовать повторно, поэтому, когда у них уже есть назначенный цвет, вы получите ячейку, которая уже окрашена, когда она будет удалена, вместо «свежей».

Смежные вопросы