在滚动表视图之前,图像不会加载

时间:2019-01-20 15:31:21

标签: c# ios .net xamarin xamarin.ios

我有Xamarin.iOS项目,我在哪里使用TableView

这是tableView源代码

 public class ExperienceSourceNew: UITableViewSource
{
    private UINavigationController primNav { get; set; }
    private UITableView tableView { get; set; }
    List<Experience> TableItems;
    ExperienceViewControllerNew _owner;
    static NSString cellIdentifier = new NSString("newcell_id");
    public ExperienceSourceNew(List<Experience> items, ExperienceViewControllerNew owner, UINavigationController nav)
    {
        TableItems = items;
        _owner = owner;
        primNav = nav;
    }
    public override nint RowsInSection(UITableView tableview, nint section)
    {

        if (TableItems.Count == 0)
        {


            var noDataLabel = new UILabel
            {
                Text = "No Experiences at your location at this time. Try to change destination",
                TextColor = UIColor.Black,
                TextAlignment = UITextAlignment.Center,
                LineBreakMode = UILineBreakMode.WordWrap,
                Lines = 0
            };
            tableview.BackgroundView = noDataLabel;
            tableview.SeparatorStyle = UITableViewCellSeparatorStyle.None;

            return TableItems.Count;
        }
        else
        {
            tableview.BackgroundView = null;
            tableview.SeparatorStyle = UITableViewCellSeparatorStyle.SingleLine;
            return TableItems.Count;
        }


    }

    public override async void RowSelected(UITableView tableView, NSIndexPath indexPath)
    {
        var selectedExperience = await ExperienceMethods.GetSelectedTour(TableItems[indexPath.Row].id);
        if (selectedExperience == "Saved")
        {
            ExperienceDetailViewController ExperienceDetailController = primNav.Storyboard.InstantiateViewController("ExperienceDetailViewController") as ExperienceDetailViewController;
            primNav.PushViewController(ExperienceDetailController, true);

        }
        else
        {
            UIAlertController okAlertController = UIAlertController.Create("", "Cannot select this experience", UIAlertControllerStyle.Alert);
            okAlertController.AddAction(UIAlertAction.Create("OK", UIAlertActionStyle.Default, null));
        }
        tableView.DeselectRow(indexPath, true);

    }


    public override UITableViewCell GetCell(UITableView tableView, NSIndexPath indexPath)
    {
        var cell = (ExperienceCellNew)tableView.DequeueReusableCell(cellIdentifier, indexPath);
        Experience item = TableItems[indexPath.Row];
        cell.UpdateCell(item);
        return cell;
    }

我为TableView使用自定义单元格,因此这里是代码

public ExperienceCellNew (IntPtr handle) : base (handle)
    {

    }
    internal void UpdateCell(Experience experience)
    {
        var image_url = "https://xplorpal.com/" + experience.cover_image.img_path + "/150x150/" + experience.cover_image.img_file;
        ExperienceTitleNew.Text = experience.title;
        ExperiencePriceNew.Text = "$" + experience.price;
        NSUrlSession session = NSUrlSession.SharedSession;
        var dataTask = session.CreateDataTask(new NSUrlRequest(new NSUrl(image_url)), (data, response, error) =>
        {
            if (response != null)
            {
                DispatchQueue.MainQueue.DispatchAsync(() =>
                {
                    ExperienceImageNew.Image = UIImage.LoadFromData(data);
                });
            }
        });

        dataTask.Resume();
    }
}

我的问题是,图像未出现在“视图”加载中,标签中有文本,但没有图像。如果我滚动TableView,图像将显示在单元格中。

哪里有问题以及如何解决?

2 个答案:

答案 0 :(得分:2)

具有大量行的表视图在给定的时间仅显示其总项目的一小部分。对于表视图来说,仅要求显示要显示的行的单元格是有效的,因此在滚动表视图时,这些单元格重新使用,并重新填充单元格中的数据。

由于您使用的是下载的图片,因此显示速度很慢。

您可以尝试加载与单元格中的图像视图大小相同的图像。

This is similar to your issue

还将图像分配给主线程上的imageview并使其同步,因为UI更改需要同步访问主线程。

答案 1 :(得分:0)

或者,您可以使用FFImageLoading来完成此操作

ImageService.LoadUrl(image_url).Into(ExperienceImageNew);