Удалить динамическую ячейку в методе GetCell

Я пытаюсь удалить ячейку из 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, то возникла проблема с получением изображения, поэтому я хочу его удалить. Что я сейчас делаю, так это устанавливаю для скрытого свойства значение 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;
   });
}

person Jake    schedule 04.10.2013    source источник


Ответы (1)


Вы удаляете ячейки, удаляя их из источника, а затем сообщаете UITableView, что источник изменился, вызывая ReloadData().. Это запустит процесс обновления. UITableView спросит ваш источник, сколько строк есть, и поскольку вы удалили одну строку из своих данных, ячейка, представляющая эту строку, исчезнет. Однако ReloadData() перезагрузит всю вашу таблицу. Существует метод, который позволяет вам удалять ячейки с именем DeleteRows().. Пример можно найти здесь по адресу Xamarin.

При удалении строк важно сначала обновить модель, а затем обновить пользовательский интерфейс.

В качестве альтернативы я рекомендую вам проверить MonoTouch.Dialog, который позволяет взаимодействовать с UITableView более прямым способом. . Он также включает поддержку ленивой загрузки изображений.

person Krumelur    schedule 05.10.2013