Перейти к содержанию
Fire Monkey от А до Я
  • 0

Отображение в виде плиток


andahay

Вопрос

Всем доброго дня. Вопрос такой. Как мне сделать список в виде плиточек (как на картинке). Где-то читал что это можно сделать с помощью listview, но снова найти не смог. И желательно поподробнее объяснить как именно работать с listview(если делается через него)

apps.8981.13510798886605648.30220231-2fe1-4033-8cb8-4ad070099854.jpg

Изменено пользователем andahay
Ссылка на комментарий
  • Ответы 58
  • Создана
  • Последний ответ

Лучшие авторы в вопросе

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

  • 0

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

Ссылка на комментарий
  • 0
  • Модераторы
20 минут назад, haword сказал:

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

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

будет время проверьте теорию:

  1. скройте родной Bitmap
  2. создайте TListItemImage
  3. в него загрузите картинку (предварительно уберите свои костыли)
  4. при очистке LV, сделайте сначала удаление TListItemImage
procedure ClearLV(const aLV: TListView; aBitmapClear: boolean = false);
var
  iBitmap: TListItemImage;
begin
  if aLV.Items.Count = 0 then
    Exit;
  while aLV.Items.Count > 0 do
  begin
    if aBitmapClear then
    begin
      iBitmap := aLV.Items[0].Objects.FindDrawable('bitmap' + J.ToString) as TListItemImage;
      if Assigned(iBitmap) then
      begin
        iBitmap.Bitmap.Free;
        iBitmap.Bitmap := nil;
      end;
    end;
    aLV.Items.Delete(0);
  end;
end;

 

Изменено пользователем ZuBy
Ссылка на комментарий
  • 0

проблема не в том что битмапы не очищаются при очистке ListView, проблема при добавлении картинок в уже готовый список. Может конечно и дело в коде но код такой, при добавлении картинки если она не была загружена считываю картинку с БД, уменьшаю до маленького размера, делаю ListViewItem.Bitmap:=TBitmap.Create далее в него загружаю эту картинку и так далее. и при пролистывании около 100 картинок лезли глюки, даже если я не изменял количество итемов в ListView. Просто скролил вниз список. Было ощущение что где то лез out of memory и это вызывало глюки отображения. Пришлось ваять поток отдельный который будет бегать по списку добавленных ListViewItem и проверять видим ли он на экране, если нет то его Bitmap очищаю и из списка удаляю ListViewItem.

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

Ссылка на комментарий
  • 0
  • Модераторы
2 минуты назад, haword сказал:

проблема не в том что битмапы не очищаются при очистке ListView, проблема при добавлении картинок в уже готовый список. Может конечно и дело в коде но код такой, при добавлении картинки если она не была загружена считываю картинку с БД, уменьшаю до маленького размера, делаю ListViewItem.Bitmap:=TBitmap.Create далее в него загружаю эту картинку и так далее. и при пролистывании около 100 картинок лезли глюки, даже если я не изменял количество итемов в ListView. Просто скролил вниз список. Было ощущение что где то лез out of memory и это вызывало глюки отображения. Пришлось ваять поток отдельный который будет бегать по списку добавленных ListViewItem и проверять видим ли он на экране, если нет то его Bitmap очищаю и из списка удаляю ListViewItem.

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

странно, но мне кажется дело не в TListView. смотрите внимательно на код который грузит из БД.

потому что я проверял на самом дохлом устройстве которое нашел (samsung duos или как-то так диагональ 3.2, оперативка 512 мб)

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

Ссылка на комментарий
  • 0

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

а загрузка из БД обычная.

procedureUpdateItemImage(AItem: TListViewItem);
....
		bmp:= TBitmap.Create;
               q:= TFDQuery.Create(nil);
               q.Connection:= dm.DBCon;

                 q.SQL.Text:= 'select im.Image '
                  + ' from imagestorecipe itr '
                  + ' left join images im on'
                  + ' im.imageId = itr.imageId'
                  + ' where'
                  + ' itr.recipeId = ' + IntToStr(AItem.Data['r_id'].AsInteger);
                 try
                     q.open;
                 except
                 end;

                 if not q.Eof then
                 begin
                    BlobStream := q.CreateBlobStream(q.FieldByName('Image'),TBlobStreamMode.bmRead);
                    try
                        bmp.LoadFromStream(BlobStream);
                        if bmp.Height > bmp.Width then
                           bmp.Rotate(90);
                        FitRect := TRectF.Create(0, 0, bmp.Width, bmp.Height);
                        FitRect := FitRect.FitInto(TRectF.Create(0, 0, 80, 40));
                        AItem.Bitmap:=TBitmap.Create;
                        AItem.Bitmap.Width:=80;
                        AItem.Bitmap.Height:=40;
                        AItem.Bitmap.Clear(TAlphaColors.Null);
                        if not bmp.IsEmpty and AItem.Bitmap.Canvas.BeginScene then
                        try
                          AItem.Bitmap.Canvas.DrawBitmap(bmp, TRectF.Create(0, 0, bmp.Width, bmp.Height), FitRect, 1);
                        finally
                          AItem.Bitmap.Canvas.EndScene;
                        end;

                    finally
                      BlobStream.free;
                    end;

                 end;
                 bmp.free;
                 q.Free;


 

Ссылка на комментарий
  • 0
  • Модераторы
7 минут назад, haword сказал:

AItem.Bitmap:=TBitmap.Create;

а зачем создавать Bitmap? вы его сами грохаете в другом потоке?

Ссылка на комментарий
  • 0

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

Изменено пользователем haword
Ссылка на комментарий

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

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

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

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

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

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

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

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

  • Последние посетители   0 пользователей онлайн

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