0

如果单元格的图像是坏图像,我正在尝试从 UITableView 中删除一个单元格。基本上,我的代码对每个单元格的图像执行 threadPool 调用,以使绑定数据的流程在用户滚动时平滑,就像在 GetCell 方法中一样:

public override UITableViewCell GetCell (UITableView tableView, MonoTouch.Foundation.NSIndexPath indexPath)
{
 //other stuff
    ThreadPool.QueueUserWorkItem(new WaitCallback(RetrieveImage),(object)cell);
}

在该异步方法中,我调用 cell.imageUrl 属性并将其绑定到 NSData 对象,如下所示:

NSData data = NSData.FromUrl(nsUrl); //nsUrl is cell.imageUrl

从那里我知道如果data==null则检索图像时出现问题,因此我想将其删除。我目前所做的是将 hidden 属性设置为 true,但这会留下一个空白区域。我想删除整个单元格,这样用户甚至都不知道它的存在。我无法将单元格高度设置为 0,因为我不知道 imageUrl 是否坏,直到 indexrowpath 启动 getcell 调用。我不想只检查绑定到 UITableView 的数据中的所有图像,因为这会对性能造成很大的影响,因为它很容易包含一百个项目。我目前正在从一个提供前 200 个项目的网络服务中获取项目。如果 data==null 示例,我如何完全删除单元格

NSUrl nsUrl = new NSUrl(cell.imageUrl);
NSData data = NSData.FromUrl(nsUrl);
if (data != null) {
     InvokeOnMainThread (() => {
    cell.imgImage = new UIImage (data);
    //cell.imgImage.SizeToFit();
});
 } else {
   //I tried the below line but it does't work, I have a cell.index property that I set in the getCell method
   _data.RemoveAt(cell.Index);//_data is the list of items that are binded to the uitableview
    InvokeOnMainThread (() => {
    //cell.Hidden = true;
   });
}
4

1 回答 1

1

您通过从源中删除单元格来删除它们,然后通过调用这将触发刷新过程UITableView来告知源已更改。将询问您的来源有多少行,并且由于您从数据中删除了一行,因此代表该行的单元格将消失。但是会重新加载你的整个表。有一种方法可以让您专门删除单元格,名为You can find an example here at XamarinReloadData().UITableViewReloadData()DeleteRows().

删除行时,请务必先更新模型,然后更新 UI。

或者,我建议您查看MonoTouch.Dialog,它允许以更直接的方式与 UITableView 交互。它还包括对延迟加载图像的支持。

于 2013-10-05T10:25:25.707 回答