title: DequeueReusableCell in Monotouch causes cells to rearrange when scrolling
body: <p>I am using the Monotouch.Dialog class to populate a <code>UITableView</code>. I am using a custom cell and as you can see the code in the Element that gets the cell is as follows:</p>
  
  <pre><code>public override UITableViewCell GetCell (UITableView tv)
  {
  var cell = tv.DequeueReusableCell(_key) as FoodItemCell;
  
  if (cell == null)
     cell = new FoodItemCell(_foodItem, _key);
  else
     cell.UpdateCell(_foodItem);
  
  return cell;
  }
  </code></pre>
  
  <p>I got this code from a Miguel De Icaza post online that suggest the proper way to create custom cells for the MonoTouch.Dialog.</p>
  
  <p>The Data is displayed appropriately but when I have a long list and I scroll up and down quickly, the cells swap places in a random unpredictable fashion. So the cell in row in may end up in row 4 when I am finished scrolling.</p>
  
  <p>When I use the following code this problem is solved but as you can see I am not dequeueing cells and this may create memory issues.</p>
  
  <pre><code>private FoodItemCell _currentCell;
  
  public override UITableViewCell GetCell (UITableView tv)
  {
      if(_currentCell == null)
      {
          _currentCell = new FoodItemCell(_foodItem, _key);
          return _currentCell;
      }
      else
      {
          return _currentCell;
      }
  }
  </code></pre>
  
  <p>Here is the full code:</p>
  
  <pre><code>public class FoodItemElement: Element
  {
      private static NSString _key = new NSString ("foodItemCell");
      private FoodItem _foodItem;
      public event EventHandler&lt;ElementClickedEventArgs&gt; ElementClicked;
  
  
      public FoodItemElement(FoodItem foodItem): base(null)
      {
          _foodItem = foodItem;
      }
  
      public override UITableViewCell GetCell (UITableView tv)
      {
          var cell = tv.DequeueReusableCell(_key) as FoodItemCell;
  
          if (cell == null)
              cell = new FoodItemCell(_foodItem, _key);
          else
              cell.UpdateCell(_foodItem);
  
          return cell;
      }
  }
  
  
  public class FoodItemCell: UITableViewCell
  {    
      private FoodItemCellDataView _dataView;
      private FoodItem _foodItem;
  
      public FoodItemCell(FoodItem data, NSString key) : base (UITableViewCellStyle.Default, key)
      {
          _foodItem = (FoodItem)data;
          _dataView = new FoodItemCellDataView(_foodItem);
  
          ContentView.Add(_dataView);
          ConstructCell();
      }
  
      public override void LayoutSubviews ()
      {
          base.LayoutSubviews ();
          _dataView.Frame = ContentView.Bounds;
          _dataView.SetNeedsDisplay ();
      }
  
       /// &lt;summary&gt;
       /// Updates the cell.
       /// &lt;/summary&gt;
      public void UpdateCell(FoodItem newData)
      {
          _dataView.Update(newData);
          SetNeedsLayout();
      }
  
      /// &lt;summary&gt;
      /// Constructs the cell.
      /// &lt;/summary&gt;
      private void ConstructCell()
      {
          //This prevents the default blue color when selecting the cell.
          //this.SelectionStyle = UITableViewCellSelectionStyle.None;
          //this.ContentView.BackgroundColor = UIColor.White;
  
          var lblFoodItemName = new UILabel();
          lblFoodItemName.Frame = new System.Drawing.RectangleF(4,2,270,20);
          lblFoodItemName.TextColor = UIColor.Black;
          lblFoodItemName.Font = Fonts.H3;
          lblFoodItemName.BackgroundColor = UIColor.Clear;
          lblFoodItemName.Text = _foodItem.Name;
  
          var lblCalories = new UILabel();
          lblCalories.Frame = new System.Drawing.RectangleF(15,22,75,20);
          lblCalories.TextColor = UIColor.Black;
          lblCalories.Font = Fonts.Small;
          lblCalories.BackgroundColor = UIColor.Clear;
          lblCalories.Text = "CAL - " + _foodItem.CaloriesRounded.ToString();
  
          var lblPortion = new UILabel();
          lblPortion.Frame = new System.Drawing.RectangleF(95,22,190,20);
          lblPortion.TextColor = UIColor.Black;
          lblPortion.Font = Fonts.Small;
          lblPortion.BackgroundColor = UIColor.Clear;
          lblPortion.Text = "Portion - " + _foodItem.Portion.ToString();
  
          this.ContentView.AddSubview(lblFoodItemName);
          this.ContentView.AddSubview(lblCalories);
          this.ContentView.AddSubview(lblPortion);
  
          Accessory = UITableViewCellAccessory.DisclosureIndicator;
      }   
  }
  
  
  // I create a view that renders my data, as this allows me to reuse
  // the data rendering outside of a UITableViewCell context as well.
  public class FoodItemCellDataView : UIView {
  
       public FoodItemCellDataView(FoodItem foodItem)
       {
            Update (foodItem);
       }
  
       // Public method, that allows the code to externally update
       // what we are rendering.   
       public void Update(FoodItem foodItem)
       {
            SetNeedsDisplay();
       }
  }
  </code></pre>
  
  <p>Does anyone have an idea how I can properly dequeue the cells and not have the scrolling issue?</p>