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

ListView и фильтр в Berlin


haword

Вопрос

Привет всем.

Столкнулся с непонятной ситуацией, поискал в гугле, не нашел ничего похожего. Проблема - есть ListView, в него загружаются в отдельном потоке строки, под 100 штук, проект ранее работал отлично на Seattle, просто тупо перенес в Berlin. Вроде все красиво, все работает. НО как только попробовал использовать фильтр так облом. Фильтруются только те строки которые видны были на экране. Если я не сролил вниз список то те сроки что не были показаны в фильтр попадают с пустыми значениями и мой фильтр их отсекает. Если я проскролю вниз вверх список то в фильтр попадают все строки и он начинает работать нормально. 

Я так понимаю проблема из-за нового ListView в Берлине. Ощущение что не создаются поля пока не будут показаны на экране и из-за этого они пустые при фильтрации. Как лечить? Создавать в дизайнтайме поля ListView? 

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

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

  • 0

Добрый день.
У меня в Berlin фильтрация происходит нормально и с невидимыми на экране строками. Всего 160 строк в Listview. 

Фильтрую через TEdit:

procedure TForm1.SearchChangeTracking(Sender: TObject);
var Lower: string;
begin
    Lower := Search.Text.Trim.ToLower;
    if Lower = '' then begin
        if Assigned(listView1.Items.Filter) then listView1.Items.Filter := nil;
    end
    else begin
        listView1.ItemIndex := -1;
        listView1.Items.Filter := function(X: string): Boolean
        begin
            Result := Lower.IsEmpty or X.ToLower.Contains(Lower);
        end;
    end;
end;

 

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

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

кидаем на форму ListView, выставляем свойство показать строку поиска. на кнопку вешаем сие действие, запускаем, все красиво, ищет все что занесли

var
 i: Integer;
 l: TListViewItem;
begin
  ListView1.Items.Clear;
  for I := 0 to 1000 do
    begin
      l:= ListView1.Items.Add;
      l.Text:= i.ToString;
    end;

end;
И начинается самое интересное, изменяем процедуру добавив всего одну сроку l.Data['id'] := i; типа храним идентификатор, и ставим его ДО заполнения поля Text, запускаем программу, заполняем данными, вуаля, в поиске только видимые строки )

var
 i: Integer;
 l: TListViewItem;
begin
  ListView1.Items.Clear;
  for I := 0 to 1000 do
    begin
      l:= ListView1.Items.Add;
      l.Data['id'] := i;
      l.Text:= i.ToString;
    end;

end;

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

решение, сперто из токио. 

procedure TListViewItem.SetData(const AIndex: string; const AValue: TValue);
var
  LObject: TListItemDrawable;
  LHandled: Boolean;
  LDataObject: TObject;
  LBitmap: TBitmap;
begin
  if FData = nil then
    FData := TDictionary<string, TValue>.Create;
  if not AValue.IsObject then
  begin
    FData.AddOrSetValue(AIndex, AValue);
    LHandled := False;
    if View.Initialized then // ДОБАВЛЕНО
    begin
      if Objects.Appearance <> nil then
        Objects.Appearance.SetObjectData(Self, AIndex, AValue, LHandled);
      if not LHandled then
      begin
        LObject := Objects.FindDrawable(AIndex);
        if LObject <> nil then
          LObject.Data := AValue;
      end;
    end; // ДОБАВЛЕНО
  end
  else

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

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

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

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

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

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

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

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

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

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

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