Перейти к содержанию
  • Регистрация
  • 0
Mars M

ListView задать размер скроллбара

Вопрос

Загружаю большой список в ListView, время загрузки где то 5-7 секунд.

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

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

Это не очень нравиться :)

Можно как то заранее настроить его размер под конечное число итемов?

Или может как то по другому сделать.

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


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

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

  • 0

единственное что можно сделать, это скрыть его, но тут на вкус и цвет

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


Ссылка на сообщение
Поделиться на другие сайты
  • 0
В 24.04.2017 в 11:29, Mars M сказал:

Загружаю большой список в ListView, время загрузки где то 5-7 секунд.

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

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

Это не очень нравиться :)

Можно как то заранее настроить его размер под конечное число итемов?

Или может как то по другому сделать.

Вы можете поступить следующим образом - сразу создать нужное количество итемов и задать им высоту (или среднюю высоту) готово итема. Это будет очень быстро, по крайней мере для нескольких тысяч итемов время менее секунды на среднем телефоне. А потом динамически наполнять их данными. 

P.S Не забудьте отключить события ListViewUpdatingObjects и ListViewUpdateObjects на время создания итемов.

Изменено пользователем Евгений Корепов

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


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

Сейчас пойдут возможно глупые вопросы :)

Я всегда использовал ListBox, он мне всем нравился, я в нем и рисовал, выводил текст как мне нужно и заполнял разными данными.

Например сделать что то типа такого не составляет никакого труда:

Скрытый текст

2017-04-26_141427.png.c3ac0723d116ec87d379946955739d28.png

 

Но сейчас рекомендуют LIstView и он действительно быстрее, но вот пока только одни сложности с ним, но думаю разберусь :)

1 час назад, Евгений Корепов сказал:

сразу создать нужное количество итемов и задать им высоту (или среднюю высоту) готово итема.

Можно сразу создать необходимое количество пустых итемов или в цикле добавлять по одному?

  ListView1.BeginUpdate;
  for i := 0 to List.Count - 1 do
  begin
     LVItems := ListView1.Items.Add;
     ...
  end;
  ListView1.EndUpdate;

Потому что так у меня тоже достаточно долго добавляются итемы.

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

Вобщем пока я это дело отложил и оставил как есть.

Во первых когда пользователь грузит такой большой файл(текстовый) то он должен понимать что займет какое то время на его обработку.

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

 

 

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


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

Во время добавления так же можно отключить обработчики  ListView1.OnUpdatingObjects и(или) ListView1.OnUpdateObject (если у вас в них есть какой либо код).

  ListView1.BeginUpdate;
  ListView1.OnUpdatingObjects:=Nil;
  ListView1.OnUpdateObjects:=Nil;
  for i := 0 to List.Count - 1 do
  begin
     LVItems := ListView1.Items.Add;
	 LVItems.Data['MyData']:=...
     ...
  end;
  ListView1.OnUpdatingObjects:=ListView1UpdateObjects;
  ListView1.OnUpdateObjects:=ListView1UpdatingObjects;
  ListView1.EndUpdate;

 

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


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

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

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

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

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

  Разрешено использовать не более 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
    • От 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; а для заголовка ил подвала не нахожу примеров
    • От 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 и удалить итем то ошибка не выскакивает)
       
      что за прикол?
    • От sinuke
      Доброго дня, форумчане
      Возникла проблема с тем, чтобы поменять местами два итема в ListView. ListView.Items не имеет метода Exchange, сами итемы не имеют метода Assign чтобы можно было один итем клонировать в другой / удалить / вставить
      У кого какие мысли? Как реализовать?
      Delphi 10.2 Tokyo
       
    • От x11
      Не могу понять, как записать текст в Footer text
       
       

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

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

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