Delphi Can

Orjinalini görmek için tıklayınız: FMX Listview Image Sorunu [ÇÖZÜLDÜ]
Şu anda (Arşiv) modunu görüntülemektesiniz. Orjinal Sürümü Görüntüle internal link
Merhaba Delphi FMX Android projemde aşağıda görüldüğü üzere sunucudan JSon formatında verileri alıyorum ve listeliyorum tek sıkıntı yaşadığım konu ise öncesinde Timage nesnesine sunucudaki resmi yüklüyorum ve  
Toggle Design Mod'da oluşturmuş olduğum Image3 nesnesine bu  Timage nesnesindeki resmi yüklüyorum, bu durumda  sürekli ayrı resim (en son kayıda ait resimler) yükleniyor bu sorunu nasıl aşabilirim yardımcı olur musunuz 

function TForm1.LoadData(Aranan:String):Boolean;
var
i,j:Integer;
LItem: TListViewItem;
Parametre,Parametre1,Parametre2,Parametre3,Parametre4:TStringList;
donen:String;
jSubPar: TJSONPair;
jsonStringData,StokKodu,StokAdi : String;
JsonValue: TJSONValue;
jsonData,JSONObject ,musteriler: TJSONObject;
dataArray: TJSONArray;
dataItem: TJSONObject;
ID,CC_CODE,CC_NAME:String;
Begin


   try
   try
   Result:=True;
   Result:=True;
   Parametre:=TStringList.Create;
   Parametre.Clear;
   Parametre.Add('function=PurchasePriceResearchHistory');
   Parametre.Add('aranan='+Aranan);
   donen:= GetUrlJson(HTTP_ADREES,'?function=','PurchasePriceResearchHistory',Parametre);
   jsonData := TJSONObject.ParseJSONValue(TEncoding.UTF8.GetBytes(donen), 0) as TJSONObject;
   jsonDataList := TList<TJSONObject>.Create;

    try
    dataArray :=jsonData.GetValue('Data') as TJSONArray;
     if (dataArray.Count>0) then
     Begin
       dataArray.Items[0].TryGetValue('PURCHASE_PRICE_HISTORY_ID', ID);
       dataArray.Items[0].TryGetValue('PRODUCT_CODE',CC_CODE);
       dataArray.Items[0].TryGetValue('PRODUCT_NAME',CC_NAME);
       for I := 0 to dataArray.Count - 1 do
       begin
       musteriler := dataArray.Get(i) as TJSONObject;
       jsonDataList.Add(musteriler);
       Inc(j);
       end;
     End;
     j:=1;
     ListView1.Items.Clear;
     ListView1.BeginUpdate;

     for I := 0 to dataArray.Count-1 do
     Begin
     musteriler:= (dataArray.Get(i) as TJSONObject);
     Application.ProcessMessages;
     LItem := ListView1.Items.Add;
     LItem.Height:=70;
     LItem.Tag:=musteriler.GetValue<Integer>('PURCHASE_PRICE_HISTORY_ID');
     LItem.ButtonText:=musteriler.GetValue<String>('CUSTOMER_TITLE')+' '+musteriler.GetValue<String>('PRODUCT_NAME');
     LItem.Detail:=musteriler.GetValue<String>('PRODUCT_NAME');
     LItem.Text := musteriler.GetValue<String>('CUSTOMER_TITLE')+' - '+musteriler.GetValue<String>('PRODUCT_NAME') ;
     TListItemText(LItem.Objects.FindDrawable('Text1')).SelectedTextColor:=TAlphaColorRec.Darkgreen;
     TListItemText(LItem.Objects.FindDrawable('Text1')).Text:=musteriler.GetValue<String>('PRODUCT_NAME');
     TListItemText(LItem.Objects.FindDrawable('Text2')).Text:=musteriler.GetValue<String>('CUSTOMER_TITLE');
     TListItemText(LItem.Objects.FindDrawable('Text4')).Text:=musteriler.GetValue<String>('RECORD_DATE');
     TListItemText(LItem.Objects.FindDrawable('Text5')).Text:='Oluşturma Tarihi';
     LoadImageFromURL(Image2,SERVER_IMAGE_ADDRESS+musteriler.GetValue<String>('URL_PATH'));
     TListItemImage(LItem.Objects.FindDrawable('Image3')).Bitmap:=Image2.Bitmap;
     Inc(j);
     End;

    except

    raise;
    end;


   finally
     ListView1.EndUpdate;
   end;
   if j=0 then
  Begin
    ShowMessage('Listelenecek Data yok.!');

  End else
  Begin

  End;

 except on E: Exception do
 end;


End;
Merhaba Sorunu Şu Şekilde çözdüm Öncelikle ImageList Adında Bitmap türünde TList oluşturdum, Sonra ImageListLoad isimli bir fonksiyon oluşturup resimleri ImageList içine doldurdum. Daha sonra her satırda Bu liste içine karşılık gelen değerleri Image3 içinde gösterdim işim bittikten sonra da ImageList Free yaparak. gereksiz yük bindirme olayını kaldırdım.
İçerikleri aşağıda paylaşıyorum umarım ihtiyacı olanın işine yarar.

function TForm1.LoadData(Aranan:String):Boolean;
var
i,j:Integer;
LItem: TListViewItem;
Parametre,Parametre1,Parametre2,Parametre3,Parametre4:TStringList;
donen:String;
jSubPar: TJSONPair;
jsonStringData,StokKodu,StokAdi : String;
JsonValue: TJSONValue;
jsonData,JSONObject ,musteriler: TJSONObject;
dataArray: TJSONArray;
dataItem: TJSONObject;
ID,CC_CODE,CC_NAME:String;
ImageList: TList<TBitmap>;
Begin


  try
  try
  Result:=True;
  Result:=True;
  Parametre:=TStringList.Create;
  Parametre.Clear;
  Parametre.Add('function=PurchasePriceResearchHistory');
  Parametre.Add('aranan='+Aranan);
  donen:= GetUrlJson(HTTP_ADREES,'?function=','PurchasePriceResearchHistory',Parametre);
  jsonData := TJSONObject.ParseJSONValue(TEncoding.UTF8.GetBytes(donen), 0) as TJSONObject;
  jsonDataList := TList<TJSONObject>.Create;

   try
   dataArray :=jsonData.GetValue('Data') as TJSONArray;
    if (dataArray.Count>0) then
    Begin
      dataArray.Items[0].TryGetValue('PURCHASE_PRICE_HISTORY_ID', ID);
      dataArray.Items[0].TryGetValue('PRODUCT_CODE',CC_CODE);
      dataArray.Items[0].TryGetValue('PRODUCT_NAME',CC_NAME);
      for I := 0 to dataArray.Count - 1 do
      begin
      musteriler := dataArray.Get(i) as TJSONObject;
      jsonDataList.Add(musteriler);
      Inc(j);
      end;
    End;
ImageList := ImageListLoad(SERVER_IMAGE_ADDRESS, dataArray);
    j:=1;
    ListView1.Items.Clear;
    ListView1.BeginUpdate;

    for I := 0 to dataArray.Count-1 do
    Begin
    musteriler:= (dataArray.Get(i) as TJSONObject);
    Application.ProcessMessages;
    LItem := ListView1.Items.Add;
    LItem.Height:=70;
    LItem.Tag:=musteriler.GetValue<Integer>('PURCHASE_PRICE_HISTORY_ID');
    LItem.ButtonText:=musteriler.GetValue<String>('CUSTOMER_TITLE')+' '+musteriler.GetValue<String>('PRODUCT_NAME');
    LItem.Detail:=musteriler.GetValue<String>('PRODUCT_NAME');
    LItem.Text := musteriler.GetValue<String>('CUSTOMER_TITLE')+' - '+musteriler.GetValue<String>('PRODUCT_NAME') ;
    TListItemText(LItem.Objects.FindDrawable('Text1')).SelectedTextColor:=TAlphaColorRec.Darkgreen;
    TListItemText(LItem.Objects.FindDrawable('Text1')).Text:=musteriler.GetValue<String>('PRODUCT_NAME');
    TListItemText(LItem.Objects.FindDrawable('Text2')).Text:=musteriler.GetValue<String>('CUSTOMER_TITLE');
    TListItemText(LItem.Objects.FindDrawable('Text4')).Text:=musteriler.GetValue<String>('RECORD_DATE');
    TListItemText(LItem.Objects.FindDrawable('Text5')).Text:='Oluşturma Tarihi';
   // LoadImageFromURL(Image2,SERVER_IMAGE_ADDRESS+musteriler.GetValue<String>('URL_PATH'));
   //TListItemImage(LItem.Objects.FindDrawable('Image3')).Bitmap:=Image2.Bitmap;
    TListItemImage(LItem.Objects.FindDrawable('Image3')).Bitmap:=ImageList[i];
    Inc(j);
    End;
ImageList.Free;
   except

   raise;
   end;


  finally
    ListView1.EndUpdate;
  end;
  if j=0 then
 Begin
   ShowMessage('Listelenecek Data yok.!');

 End else
 Begin

 End;

except on E: Exception do
end;


End;

 Bu da ImageListLoad Fonksiyonunun içeriği 
function ImageListLoad(const AServerAddress: string; const ADataArray: TJSONArray): TList<TBitmap>;
var
 IdHTTP: TIdHTTP;
 SSLIOHandler: TIdSSLIOHandlerSocketOpenSSL;
 ResimURL: string;
 ResimStream: TMemoryStream;
 I: Integer;
 Bitmap: TBitmap;
begin
 Result := TList<TBitmap>.Create;
 IdHTTP := TIdHTTP.Create(nil);
 SSLIOHandler := TIdSSLIOHandlerSocketOpenSSL.Create(nil);

 try
   IdHTTP.IOHandler := SSLIOHandler;
   ResimStream := TMemoryStream.Create;
   try
     for I := 0 to ADataArray.Count - 1 do
     begin
       ResimURL := AServerAddress + ADataArray.Items[I].GetValue<string>('URL_PATH');
       try
         IdHTTP.Get(ResimURL, ResimStream);
         ResimStream.Position := 0;

        
         Bitmap := TBitmap.Create;
         Bitmap.LoadFromStream(ResimStream);
         Result.Add(Bitmap);
       except
   
         Result.Add(nil);
       end;
       ResimStream.Clear;
     end;
   finally
     ResimStream.Free;
   end;
 finally
   IdHTTP.Free;
   SSLIOHandler.Free;
 end;
end;