xamarin 通用图像加载器,无需将其置于视图中

xamarin universal image loader without putting it in view

我正在尝试使用 xamarin 中的通用图像加载器将图像加载到变量中。但是它总是 returns null。我尝试了几种方法,但 none 似乎可以解决问题。这是我的代码。唯一在 none 通用图像加载器中工作的一个。

private async void GetImages(CardsAdapter adapter, List<Card> cards)
        {
            WebClient client = new WebClient();

            foreach (var card in cards)
            {
                //var data = await client.DownloadDataTaskAsync(card.imageUrl);
                //card.image = new BitmapDrawable(BitmapFactory.DecodeByteArray(data, 0, data.Length));
                //card.image = ImageService.AsBitmapDrawableAsync();
                //ImageLoader imageLoader = ImageLoader.Instance;
                //Bitmap bm = imageLoader.LoadImageSync(card.imageUrl);
                var bm = await LoadImage(card);
                card.image = new BitmapDrawable(bm);
                adapter.NotifyDataSetChanged();
            }
        }

        private async Task<Bitmap> LoadImage(Card card)
        {
            ImageLoader imageLoader = ImageLoader.Instance;
            Bitmap bm = imageLoader.LoadImageSync(card.imageUrl);
            //imageLoader.LoadImage(card.imageUrl, new SimpleImageLoadingListener());
            //Bitmap bm = null;
            //imageLoader.LoadImage(
            //    card.imageUrl,
            //    new ImageLoadingListener(
            //        loadingComplete: (imageUri, view, loadedImage) => {
            //            // Do whatever you want with Bitmap
            //            bm = loadedImage;
            //        }));
            return bm;
        }

感谢您的帮助!

问候,

比约恩

经过对您的代码的多次测试,您的代码运行 排除了android.os.NetworkOnMainThreadException 异常或ImageLoader must be init with configuration before using 错误。第一个异常并没有使程序停止,但它被抛出到日志中。也许这就是为什么您的 Bitmap 都为空的原因。

您可以试试这个代码:

public class MainActivity : Activity, IImageLoadingListener
{
    //Your ListView and Adapter
    protected override void OnCreate(Bundle bundle)
    {
        base.OnCreate(bundle);

        // Set our view from the "main" layout resource
        SetContentView(Resource.Layout.Main);

        // Set your ListView and Adapter here

        ImageLoader imageloader = ImageLoader.Instance;
        imageloader.Init(ImageLoaderConfiguration.CreateDefault(this));

        foreach (var card in cards)
        {          
            imageloader.LoadImage(card.imageUrl, this);
        }            
    }

    public void OnLoadingCancelled(string p0, View p1)
    {
    }

    public void OnLoadingComplete(string p0, View p1, Bitmap p2)
    {
        foreach (var card in cards)
        {
           if (card.imageUrl == p0)
           {
              card.image = p2;
              adapter.NotifyDataSetChanged();
           }               
        }
    }

    public void OnLoadingFailed(string p0, View p1, FailReason p2)
    {
    }

    public void OnLoadingStarted(string p0, View p1)
    {
    }
}

此代码由我使用,如果仍然无效,请确保您已启用 Internet 功能并且您的图片 url 是正确的。