/// <summary> Called when a cell becomes visible </summary> /// <param name="viewHolder"> use viewHolder.itemIndex to find your corresponding model and feed data into its views</param> protected override void UpdateCellViewsHolder(MyCellViewsHolder viewHolder) { var model = _Data[viewHolder.itemIndex]; viewHolder.icon.enabled = false; viewHolder.title.text = "Loading"; int itemIdexAtRequest = viewHolder.itemIndex; string requestedPath = model.imageURL; var request = new SimpleImageDownloader.Request() { url = requestedPath, onDone = result => { if (IsModelStillValid(viewHolder.itemIndex, itemIdexAtRequest, requestedPath)) { viewHolder.title.text = model.title; viewHolder.icon.enabled = true; //viewHolder.loadingProgress.fillAmount = 0f; if (viewHolder.icon.texture) { var as2D = viewHolder.icon.texture as Texture2D; if (as2D) { result.LoadTextureInto(as2D); // re-use Texture2D object return; } Destroy(viewHolder.icon.texture); // texture type incompatible => destroy it } viewHolder.icon.texture = result.CreateTextureFromReceivedData(); } }, onError = () => { if (IsModelStillValid(viewHolder.itemIndex, itemIdexAtRequest, requestedPath)) { viewHolder.title.text = "No connection"; } } }; SimpleImageDownloader.Instance.Enqueue(request); }
/// <summary>Starts the loading, setting the current image to <see cref="_LoadingTexture"/>, if available. If the image is already in cache, and <paramref name="loadCachedIfAvailable"/>==true, will load that instead</summary> public void Load(string imageURL, bool loadCachedIfAvailable = true, Action <bool, bool> onCompleted = null, Action onCanceled = null) { // Don't download the same image again if (loadCachedIfAvailable && _CurrentRequestedURL == imageURL) { if (_RecycledTexture) { if (_RecycledTexture != _RawImage.texture) { _RawImage.texture = _RecycledTexture; } if (onCompleted != null) { onCompleted(true, true); } return; } } if (_RawImage.texture) { _RecycledTexture = _RawImage.texture as Texture2D; if (_RecycledTexture == _LoadingTexture || _RecycledTexture == _ErrorTexture) { _RecycledTexture = null; } } else { _RecycledTexture = null; } _CurrentRequestedURL = imageURL; _RawImage.texture = _LoadingTexture; var request = new SimpleImageDownloader.Request() { url = imageURL, onDone = result => { if (!_DestroyPending && imageURL == _CurrentRequestedURL) // this will be false if a new request was done during downloading, case in which the result will be ignored { Texture2D texToUse; if (_RecycledTexture) { result.LoadTextureInto(_RecycledTexture); texToUse = _RecycledTexture; } else { texToUse = result.CreateTextureFromReceivedData(); } _RawImage.texture = texToUse; if (onCompleted != null) { onCompleted(false, true); } } else if (onCanceled != null) { onCanceled(); } }, onError = () => { if (!_DestroyPending && imageURL == _CurrentRequestedURL) // this will be false if a new request was done during downloading, case in which the result will be ignored { _RawImage.texture = _ErrorTexture; if (onCompleted != null) { onCompleted(false, false); } } else if (onCanceled != null) { onCanceled(); } } }; SimpleImageDownloader.Instance.Enqueue(request); }