Проблемы не существует в принципе. Пытался разобраться в коде, но из за его полной не читабельности, плюнул, все удалил а написал заново. Решил для забавы использовать анонимный поток для загрузки картинки. По кнопке все грузится и сразу отображается. Никаких костылей не используется (ну кроме как AListItemImage.OwnsBitmap:=True, но и без этого все работает).
Прилагаю код и архив проекта:
unit Unit1;
interface
uses
System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs,
FMX.ListView.Types, FMX.ListView.Appearances, FMX.ListView.Adapters.Base,
System.Net.HttpClient,
FMX.Controls.Presentation, FMX.StdCtrls, FMX.Layouts, FMX.ListView;
const
ListViewItemImageEmpy = -1;
ListViewItemImageLoading = 0;
ListViewItemImageLoaded = 1;
type
TForm1 = class(TForm)
ListView1: TListView;
Layout1: TLayout;
Button1: TButton;
procedure Button1Click(Sender: TObject);
procedure ListView1UpdatingObjects(const Sender: TObject;
const AItem: TListViewItem; var AHandled: Boolean);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
FListViewUpdating : Boolean;
procedure LoadImage(const AItemIndex : Integer; AURL : String);
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.fmx}
procedure TForm1.FormCreate(Sender: TObject);
begin
FListViewUpdating:=False;
end;
procedure TForm1.Button1Click(Sender: TObject);
var i:integer;
item:TListViewItem;
begin
listview1.ItemIndex:=0;
listview1.ItemAppearance.ItemAppearance:='Custom';
listview1.ItemAppearanceObjects.ItemObjects.Accessory.Visible:=false;
//Очистка ListView
for i := Listview1.ItemCount-1 downto 0 do
ListView1.Items.Delete(i);
//Формирование нового списка
for i := 1 to 10 do
begin
Item:=listview1.Items.Add;
item.Height:=45;
FListViewUpdating:=true;
item.data['ImageURL']:='http://fire-monkey.ru/uploads/monthly_2016_03/5-icon-29796ebcb510717e74ed258822feb2cc.png.365100cc218fe330c717aa80384fa4aa.png';
Item.Data['ImageState']:=ListViewItemImageEmpy;
FListViewUpdating:=false;
item.Adapter.ResetView(item);
end;
end;
procedure TForm1.LoadImage(const AItemIndex : Integer; AURL : String);
Var AHTTPClient : THTTPClient;
AHTTPResponse : IHTTPResponse;
begin
AHTTPClient:=THTTPClient.Create();
AHTTPResponse:=AHTTPClient.Get(AURL);
AHTTPClient.Free;
if AHTTPResponse.StatusCode <> 200 then
exit;
TThread.Synchronize(Nil,
procedure
Var AListItemImage : TListItemImage;
begin
AListItemImage:=TListItemImage(ListView1.Items.Item[AItemIndex].View.FindDrawable('s_image'));
if Assigned(AListItemImage) then
begin
AListItemImage.Bitmap:=TBitmap.Create;
AListItemImage.Bitmap.LoadFromStream(AHTTPResponse.ContentStream);
end;
end
);
end;
procedure TForm1.ListView1UpdatingObjects(const Sender: TObject; const AItem: TListViewItem; var AHandled: Boolean);
function SetupImageObject(const AName : String; AWidth, AHeight, X , Y : Single; AAlign, AVertAlign: TListItemAlign) : TListItemImage;
Var AImageState : Integer;
AImageURL : String;
AListItemImage : TListItemImage;
begin
AListItemImage:=TListItemImage(AItem.View.FindDrawable(AName));
if AListItemImage = Nil then
begin
AListItemImage:=TListItemImage.Create(AItem);
AListItemImage.Name:=AName;
AListItemImage.Bitmap:=Nil;
AListItemImage.OwnsBitmap:=True;
end;
if AListItemImage.Bitmap=Nil then
begin
AImageState:=AItem.Data['ImageState'].AsInteger;
if AImageState=ListViewItemImageEmpy then
begin
AImageURL:=AItem.Data['ImageURL'].AsString;
if Not AImageURL.IsEmpty then
begin
AItem.Data['ImageState']:=ListViewItemImageLoading;
TThread.CreateAnonymousThread(
procedure
begin
LoadImage(AItem.Index, AImageURL);
end).Start;
end;
end;
end;
AListItemImage.Width:=AWidth;
AListItemImage.Height:=AHeight;
AListItemImage.PlaceOffset.X:=X;
AListItemImage.PlaceOffset.Y:=Y;
AListItemImage.Align:=AAlign;
AListItemImage.VertAlign:=AVertAlign;
AListItemImage.ScalingMode:=TImageScalingMode.StretchWithAspect;
AListItemImage.Visible:=True;
Result:=AListItemImage;
end;
begin
if FListViewUpdating then
exit;
SetupImageObject('s_image', 35, 35, 0 , 0, TListitemalign.Leading, TListItemAlign.Center);
AHandled:=true;
end;
end.
LoadBitmaps.zip