我想在iOS中使用Xamarin和MvvmCross創建可擴展列表視圖。iOS:可擴展列表視圖不繪製新添加的控件
這個場景是我有一個列表視圖,當列表視圖中的一行被選中時,它展開(動畫)以顯示一個集合視圖,通過lazyloading加載。
下面是代碼我迄今爲止:
適配器:
public class MercatoAnimatedExpandableTableSource : MvxTableViewSource
{
private readonly string _key;
private readonly List<object> items;
private Dictionary<object, bool> expandableState = new Dictionary<object, bool>();
public MercatoAnimatedExpandableTableSource(UITableView tableView, IEnumerable<object> items, UINib nib, string key)
: base(tableView)
{
_key = key;
this.items = items.ToList();
this.items.ForEach(x => expandableState[x] = true);
tableView.RegisterNibForCellReuse(nib, key);
}
protected override UITableViewCell GetOrCreateCellFor(UITableView tableView, NSIndexPath indexPath, object item)
{
var cell = tableView.DequeueReusableCell(_key);
cell.Frame = new RectangleF(cell.Frame.X, cell.Frame.Y, cell.Frame.Width, GetHeightForRow(tableView, indexPath));
return cell;
}
public override void RowSelected(UITableView tableView, NSIndexPath indexPath)
{
base.RowSelected(tableView, indexPath);
var isExpanded = expandableState[items[indexPath.Row]];
expandableState[items[indexPath.Row]] = !isExpanded;
var row = this.GetCell(tableView, indexPath);
(row as FamilysubgroupViewCell).ExpandCells();
tableView.ReloadRows(new[] { indexPath }, UITableViewRowAnimation.Automatic);
}
public override float GetHeightForRow(UITableView tableView, NSIndexPath indexPath)
{
var isExpanded = expandableState[items[indexPath.Row]];
if (isExpanded)
{
return 25;
}
return 400;
}
protected override object GetItemAt(NSIndexPath indexPath)
{
return items[indexPath.Row];
}
}
細胞:
public FamilySubgroupViewCell (IntPtr handle) : base (handle)
{
this.DelayBind(() =>
{
this.FamilyCollectionViewContainer.BackgroundColor = UIColor.Blue;
var bindingset = this.CreateBindingSet<FamilySubgroupViewCell, FamilySubTypeViewModel>();
bindingset.Bind(this.FamilyGroupTitleLabel).To(x => x.FamilySubType.FamilySubGroupDescription);
bindingset.Bind(this.FamilyGroupDescLabel).To(x => x.FamilySubType.FamilySubGroupDetail);
bindingset.Apply();
});
}
public void ExpandCells(Action onUpdate)
{
var context = this.DataContext as FamilySubTypeViewModel;
context.PopulateAndRun(() =>
{
Debug.WriteLine("Populating Models complete : now showing cells");
var collection = new FamilySubGroupModelsCollection();
collection.ViewModel = context;
Debug.WriteLine("FamilySubGroupCell : Showing {0} Items", context.FamilyModels.Count);
this.FamilyCollectionViewContainer.Add(collection.View);
if (onUpdate != null) onUpdate();
});
}
問題
所以當一個單元格被選中時,它會翻轉'isExpanded'屬性,使其具有新的高度 - 工作正常。然後,單元會發送一條消息來'擴展'單元,然後加載一個新的集合並將其添加到視圖中(通過View出口)。
但是,該集合絕不會在視圖上重新呈現。它填充良好,添加到視圖中,但它在新擴展的單元格上實際上永遠不可見。如果我在DelayBind()方法中初始創建單元格時加載它(即 - 沒有延遲加載),那麼它工作正常。
是否嘗試過類似的事情重繪細胞
this.Draw(this.Bounds);
後的集合被添加到視圖,但無濟於事。
我在做什麼錯?
您在第一次觀察時發現了。 tableView.ReloadRows()實例化了一個新的單元,它沒有展開的集合視圖。將您在GetOrCreateCellFor中建議的代碼放在一邊。謝謝! –