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の場合、画像の取得に問題があったことがわかっているので、画像を削除したいと思います。私が現在行っていることは、隠しプロパティをtrueに設定することですが、これにより空白が残ります。セル全体を削除したいので、ユーザーはそれが存在することさえ知りません。indexrowpath が getcell 呼び出しを開始するまで imageUrl が悪いかどうかわからないため、セルの高さを 0 に設定することはできません。UITableView にバインドされたデータからすべての画像をチェックしたくありません。これは、簡単に 100 個のアイテムになる可能性があるため、パフォーマンスが大幅に低下するためです。現在、最初の 200 アイテムを提供する Web サービスからアイテムを取得しています。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呼び出してソースが変更されたことを知らせReloadData().ます。更新プロセスがトリガーされます。UITableViewは、ソースに行数を尋ねます。データから 1 行を削除したため、その行を表すセルはなくなります。ただしReloadData()、テーブル全体をリロードします。具体的には、という名前のセルを削除できるメソッドがありますXamarinDeleteRows().で例を見つけることができます。

行を削除するときは、最初にモデルを更新してから UI を更新することが重要です。

または、より直接的な方法で UITableView と対話できるMonoTouch.Dialogを確認することをお勧めします。また、画像の遅延読み込みのサポートも含まれています。

于 2013-10-05T10:25:25.707 に答える