Перейти к содержанию
  • Регистрация
  • 0
Равиль Зарипов (ZuBy)

Динамическая подгрузка картинок в ListView

Вопрос

Привет Всем!

Как принято в современных приложениях, догружать контент(обычно это картинки) при скролинге.

я взял картинки пользователей этого форума

2016-01-14 12-54-32 Form16.png

Seattle LVdynamicLoadBitmap.zip

Berlin LVdynamicLoadBitmap(Berlin).zip

Изменено пользователем ZuBy

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Рекомендуемые сообщения

  • 0

классно! еще бы сделал что бы при пропадании видимости на итеме картинка вычищалась что бы память не занимала, вообще было бы замечательно :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

классно! еще бы сделал что бы при пропадании видимости на итеме картинка вычищалась что бы память не занимала, вообще было бы замечательно :)

это не правильно, ListView итак отрисовывает только начиная с верхнего видимого Item'a.

ListView можно еще оптимизировать, т.к. он не правильно определяет кол-во видимых элементов.

 

Сейчас у него сделано так

от ПервогоВидимого до КонцаСписка 

а можно сделать так как у меня

от ПервогоВидимого до ПервогоВидимого+КоличествоВидимых

Думаю будет прирост скорости в отрисовке, если много Элементов в списке

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

Я не о том. Например есть 1000 итемов, у каждого картинка по 20 кбайт, в памяти она хранится как несжатый массив байтов и может расжиреть до 100 кбайт на картинку. Получается только под картинки сожрется 100 мбайт памяти. Короче говоря, у меня после вывода 100 картинок начинаются глюки. Картинки чернеют, надписи на итемах превращаются в снег. Как сокращаю до 50 сразу все нормально. Как то так. Я на это наткнулся на стандартном варианте работы с картинками.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

Я не о том. Например есть 1000 итемов, у каждого картинка по 20 кбайт, в памяти она хранится как несжатый массив байтов и может расжиреть до 100 кбайт на картинку. Получается только под картинки сожрется 100 мбайт памяти. Короче говоря, у меня после вывода 100 картинок начинаются глюки. Картинки чернеют, надписи на итемах превращаются в снег. Как сокращаю до 50 сразу все нормально. Как то так. Я на это наткнулся на стандартном варианте работы с картинками.

если каждый раз выгружать на невидимых, то где хранить bitmap'ы?

каждый раз качать с инета не вариант, грузить с устройства тоже.

думаю ничего хорошего из этого не выйдет

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

кэш в папку

Это будет ужасно тормозить, вот прям ужасно. Тестировали правда на другом компоненте, но также загрузка картинок из Кеша во время отрисовки...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

ну и пускай тормозит :) не обязательно что бы сразу появлялась. время будет подумаю над реализацией. но замысел такой. в итем добавлять картинку когда он еще например за 10 итемов до показа и удалять картинку если он уже после 10 итема показа. добавлять картинку можно через поток. правда работа с картинками обязательно должна быть синхронизированна с основным, но все равно. и даже если пользователь на какое то время увидит белый квадрат а потом в нем картинку, ничего страшного не произойдет. за то не будет лишнего жора памяти на портативных устройствах. на компе конечно все красиво и память можно не экономить. а вот на андроиде даже с гигом памяти уже нужна экономия, так как в памяти сидит не только твоя программ но и куча других а свопа подкачки нет. да и на андроиде веселый эффект с рассыпающимися надписями на пиксели и снегом вместо картинок не очень как то смотрится. 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

я пробовал таски запускать на андроиде, у меня программа веля себя как то не корректно. я пытался в тасках запускать заполнение картинками итемы листвью. прога запускалась, что то там начинала делать и вываливалась. если я убирал таски и использовал вызов процедуры без потока то все работало замечательно и без глюков. я так понял работа на андроиде с таками глючит. 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

я про таски а не про потоки. в тасках нет этой функци. 

и насчет OnTerminate - я так же заметил не здоровую фигню - создание 10-20 потоков очень сильно затормаживет основную систему. именно создание. никакой плавности нет при прокрутке. так что лучше это делать внутри потока а не снаружи. хотя если потоков один или два то как выход. 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

поток разделяет время ОС

в один момент на одном ядре один поток

соответственно, 20 потоков на 2 ядрах организуют очередь в 10 штук на ядро

вот и не надо столько делать))

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
5 часов назад, ZuBy сказал:

это миллион раз обсуждалось, привет хелперам

ссылка на обсуждения?

если про тот хелпер к битмапу то я не о том как загрузить, я о том что код запущенный под тасками валится и программа выгружается. а без тасков выполняется нормально хотя все обернуто анонимными вызовами как и в хелпере. 

 

да и кстати в том же примере с хелпером к битмапу если картинок много скролинг тормазит у листвью даже на винде. 

Изменено пользователем haword

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
2 часа назад, haword сказал:

да и кстати в том же примере с хелпером к битмапу если картинок много скролинг тормазит у листвью даже на винде. 

Вот небольшое видео, сорри за качество. Триалка приложения

 

2 часа назад, haword сказал:

ссылка на обсуждения?

если про тот хелпер к битмапу то я не о том как загрузить, я о том что код запущенный под тасками валится и программа выгружается. а без тасков выполняется нормально хотя все обернуто анонимными вызовами как и в хелпере. 

Так вся загрузка и должна через хелпер идти, зачем там лишнее городить?надеюсь в таксе не запускали загрузку картинки... тогда бы это все объяснило. На форуме уже выкладывал динамическую подгрузку картинок в LV. 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

ну где ссылка на тему где можно насчет картинок потрындеть? 

17 часов назад, ZuBy сказал:

Вот небольшое видео, сорри за качество. Триалка приложения

понравилось. на чем ты сделал список в два три ряда картинок с вертикальным скролом? новый компонент на листвью или на скролбоксе с панелями замутил? колись :) я то ж хочу такое сделать. 

17 часов назад, ZuBy сказал:

Так вся загрузка и должна через хелпер идти, зачем там лишнее городить?надеюсь в таксе не запускали загрузку картинки... тогда бы это все объяснило. На форуме уже выкладывал динамическую подгрузку картинок в LV. 

у меня картинки из базы данных грузятся и лагают. 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
18 минут назад, haword сказал:

ну где ссылка на тему где можно насчет картинок потрындеть? 

потрыньдеть можно хоть тут, но она не рассчитана на загрузку из БД.

24 минуты назад, haword сказал:

у меня картинки из базы данных грузятся и лагают. 

Неправильная организация архитектуры ведет к таким последствиям как у вас.

22 минуты назад, haword сказал:

понравилось. на чем ты сделал список в два три ряда картинок с вертикальным скролом? новый компонент на листвью или на скролбоксе с панелями замутил? колись :) я то ж хочу такое сделать. 

уже писал об этом тут

P.S. уважаемые модераторы, перенесите сообщения в другую тему

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

ну словесное описание каждый может сделать, кто бы куском кода помог )))

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.


  • Похожий контент

    • От krapotkin
      Всем привет!
      После долгого творческого запоя я запилил альфу либы, которая позволяет юзать обычный, не-генномодифицированный ListView.
      Данные подаются в виде модели данных, описание раскладки итема лежит в JSON.

      Для работы пишется примитивный наследник класса-адаптера, который биндит данные модели на элементы из JSON. Я решил, что руками делать это дешевле чем через RTTI
      { TMyAdapter } procedure TMyAdapter.SetupDrawableContent(const ADrawable: TListItemDrawable; const AData: TMyData); begin if SameText( ADrawable.Name, 'text') then begin (ADrawable as TListItemText).Text := AData.Text; end else if SameText( ADrawable.Name, 'detail') then begin (ADrawable as TListItemText).Text := AData.Detail; end else if SameText( ADrawable.Name, 'balance') then begin (ADrawable as TListItemText).Text := FormatFloat('0.00', AData.Balance); end else if SameText( ADrawable.Name, 'reserved') then begin (ADrawable as TListItemText).Text := FormatFloat('0.00', AData.Reserved); end end; Главная хитрость и отличие от стандартного DynamicAppearance+LiveBinding - переменная высота итемов ListView и использование арифметики в описании раскладки.
      Можно указать Detail.Y  = Text.Bottom + 5, ItemHeight = Detail.Bottom + 10, Detail.W = ItemWidth/2 - X
      {"Kind":"rect","Name":"BonusRect","Value":"", "Place":{"X":"itemwidth*3/4","Y":"Text.Y","W":"ItemWidth/4-5","H":"50"}, "BorderColor":"#FF005500", "Color":"lime", "LineWidth":3}, {"TextHAlign":2,"TextVAlign":1,"Kind":"text","Name":"Balance","Value":"", "Place":{"X":"BonusRect.x+5","Y":"Text.Y","W":"BonusRect.w-10","H":"50"}, "WordWrap":true, "Color" :"Black", "Font":{"Size":18,"Style":""}} ], "ItemHeight":"detail.bottom+10", Это дает довольно гибкую систему. Не на все случаи жизни, но все, что нужно, можно после автоматической раскладки дополнительно приписать в OnUpdateObjects 
      Код для работы примерно такой
      procedure TForm1.FormCreate(Sender: TObject); begin data:= TMyDataList.CreateFromFile(ExePath()+'data.json'); // загрузка в модель данных Adapter := TMyAdapter.Create(lvWallets, data.Items, ExePath()+'pattern.json'); // создание адаптера и загрузка шаблона Adapter.Pattern.SetupListView(lvWallets); // задать отступы и разную мелочь Adapter.ResetView(); // здесь в цикле из модели данных создается нужное количество итемов ListView end; procedure TForm1.lvWalletsUpdatingObjects(const Sender: TObject; const AItem: TListViewItem; var AHandled: Boolean); begin Adapter.SetupContent(AItem); // загрузить текст, картинки и другое содержимое в элементы итема Adapter.Pattern.DoLayout(AItem); // поправить раскладку в соответствии с содержимым элементов итема end; Для использования кроме стандартных - текст, картинка, кнопка - создано несколько дополнительных элементов итема - прямоугольник, круг, уголок, линия.
      Отличие от ModernLV - , 
      1) все происходит без правки системных файлов
      2) пока нет колонок и других особых изысков.
      На результат работы смотреть тут. Исходники пока не причесаны, будут чуть позже
       
      ListViewFramework.7z
    • От Ильдар
      Добрый день, идеология такая:
      - создать битмап, рисовать на нем, не делая его видимым.
      - нашлепать на канву панели подготовленный битмап.
       
      На деле не получается нарисовать линию на битмапе. Т.е после процедуры Draw2 прожимаю процедуру Draw - получаю на панели красный прямоугольник битмапа без нарисованной линии...
      Посоветуйте чего-нибуть, спасибо!
       
      //BITMAP Bm:= TBitmap.Create; bm.Width:= round (Panel.Width/2); bm.Height:= round (Panel.Height/2); bm.Canvas.BeginScene(); bm.Canvas.Clear(TAlphacolorrec.Red); //($FF484848); bm.Canvas.EndScene; procedure TChart.Draw2; var A,B:TPointF; begin A:=TPointF.Create(0,0); B:=TPointF.Create(200, 200); bm.Canvas.BeginScene(); bm.Canvas.DrawLine(A,B,1); bm.Canvas.EndScene; end; procedure TChart.Draw; var A: TPointF; R: TRectF; begin A.X:= Panel.Position.X+3; A.Y:= Panel.Position.Y+3; R:= TRectF.Create(A, bm.Width , bm.Height); panel.Canvas.BeginScene(); Panel.Canvas.DrawBitmap(bm,r,r, 20); panel.Canvas.EndScene; end;  
    • От Dmitry Stolyarov
      Добрый день, подскажите, пжл, новичку...
      Есть ListView и ImageList с двумя картинками. В ListView Item добавлен Image. ListView заполняю из БД и пытаюсь вывести картинку в зависимости от значения поля БД, но в независимости от значения БД выводится одна и та же картинка.. Такое нельзя провернуть?
      procedure TForm6.ListViewNAMEUpdateObjects(const Sender: TObject;
        const AItem: TListViewItem);
        var IItem:TListItemImage;
      begin
       IItem:= aItem.Objects.FindDrawable('Image4') as TListItemImage;
      if (IItem<>nil) then
      with FDQuery1 do
       begin
       First;
       while not Eof do
        begin
         if FDQuery1FK_PRICE.AsInteger = 1 then begin
          IItem.ImageIndex:=1
         end else
            begin
               IItem.OwnsBitmap := True;
           IItem.ImageIndex:=0;
            end;
         Next;
        end;
       end;
      end;
       
    • От gresaggr
      Добрый день.
      Как под FMX в ListView сделать подчеркивание Detail в рантайме?
      Пытался делать так:
      LV.ItemAppearanceObjects.ItemObjects.Detail.Font.Style := [TFontStyle.fsUnderline]
      но не срабатывает.
      P.S. Возможно это применить не ко всем строкам, а только к некоторым?
    • От ice donkey
      Заполняю ListView в рантайме:
       
       
      LiveBindings не подходит, поэтому есть вопрос: а как задать фиксированный заголовок - чтобы в списке все Items, начинающиеся с буквы А были как бы объединены под одним заголовком А? Который  в свою очередь смещался бы только заголовком Б (с Items, которые на букву Б) и так далее.
       
      Пример:
       
    • От Olexander Sagaydak
      Летом 2016 вопрос отображения объектов в ListView при создании Items уже обсуждался. Хочу ещё раз обсудить этот вопрос. А именно:
      Простой код 
      ListViewItem := ListView.Items.Add;
      ListViewItem.Objects.AccessoryObject.Visible := false; (или true, не важно)
      вторая строка не работает если до выполнения, ListView ни одного раза не отображался. Если же отображался хотя бы один раз - всё нормально.
      В предыдущих обсуждениях Krapotkin рекомендовал Resize и OnUpdateObjects. Если нет идей проще, то, конечно, воспользуюсь.  
       
    • От x11
      Если у элементов, идущих подряд одинаковый текст, то текст скрывается.
      Как это это отключить?
       
    • От x11
      Не понять, ни в справке найти, ни примеров, как получить текст из header.
      Как получить текст из какого-то элемента, есть пример:
      lvContacts.Items[li.Index].Objects.FindObjectT<TListItemText>('textTel').Text; а для заголовка ил подвала не нахожу примеров
    • От Julia
      Загружаю через opendialog картинку  формата bmp в image
      Есть переменные с:TColor, c1:Tcolor
      Необходимо  вначале узнать цвет определенного пикселя на загруженной картинке и записать в  c1, а затем изменить цвет определенного пикселя на загруженной картинке на цвет, хранящийся в переменной c.
      Ищу очень давно, но внятного объяснения нигде не нашла(
       
       
    • От Erlan_krg
      Всем привет! Встретился с одной проблемой. Удаляю Item у ListView по нажатию кнопки, которая находится на ListViewItem
      procedure TfmAppointment.lvSelectedServicesButtonClick(const Sender: TObject;
        const AItem: TListItem; const AObject: TListItemSimpleControl);
      begin
          lvSelectedServices.BeginUpdate;
          if lvSelectedServices.ItemCount > 0 then
              lvSelectedServices.Items.Delete(AItem.Index);
          lvSelectedServices.EndUpdate;
      end;
      итем удаляется, но потом выскакивает ошибка Access violation at address 60BCB318 и то се бо се
       
      у ListView ItemAppearance выставлен на DynamicAppearance
      помимо родного объекта Text добавил еще один объект Text и кнопку
       
      но фишка в чем, если убрать дополнительный объект Text с ListWiewItem и удалить итем то ошибка не выскакивает)
       
      что за прикол?
  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу

×
×
  • Создать...