Добавление и сортировка элементов под специальным заголовком с помощью TListView динамически - PullRequest
0 голосов
/ 30 октября 2018

У меня есть следующие данные: http://qs.quantumsoftware.co.za/rust/items.json

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

Так что, в основном, Item displayName под category с элементами списка и заголовками.

РЕДАКТИРОВАТЬ: я забыл упомянуть, что текст в поле категории также является динамическим, и поэтому я не знаю текст в поле категории, что делает его трудным или невозможным для поиска.

1 Ответ

0 голосов
/ 30 октября 2018

Похоже, я понял это. Мне нужно было загрузить все категории в массив, а затем создать заголовок, а затем добавить элемент, только если заголовок соответствует полю категории. Код:

procedure TDownloadItems.Execute;
var
  jdata, jcategories: TdJSON;
  http: TIdHTTP;
  LItem: TListViewItem;
  sCategories: TStringList;
  I: Integer;
  arrCategories: array of string;
begin
  SetLength(arrCategories, 0);
  http := TIdHTTP.Create(nil);
  try
    jdata := TdJSON.Parse(http.Get('http://qs.quantumsoftware.co.za/rust/items.json'));
    try
      sCategories := TStringList.Create;
      try
        sCategories.Sorted := True;
        sCategories.Duplicates := dupIgnore;

        for jcategories in jdata do
        begin
          sCategories.Add(jcategories['category'].AsString);
        end;

        SetLength(arrCategories, sCategories.Count);

        for I := 0 to sCategories.Count - 1 do
          arrCategories[I] := sCategories[I]

      finally
        sCategories.Free;
      end;

      Synchronize(
        procedure
        var
          acategory: string;
          jItems: TdJSON;
        begin
          frmMain.lvRustItems.BeginUpdate;
          for acategory in arrCategories do
          begin
            with frmMain.lvRustItems.Items.Add do
            begin
              Text := acategory;
              Purpose := TListItemPurpose.Header;
            end;
            for jItems in jdata do
            begin
              if jItems['category'].AsString = acategory then
              begin
                LItem := frmMain.lvRustItems.Items.Add;
                LItem.Text := jItems['displayName'].AsString;
                LItem.Data[TMultiDetailAppearanceNames.Detail1] := jItems['name'].AsString;
                LItem.Data[TMultiDetailAppearanceNames.Detail2] := 'Rarity: ' + jItems['rarity'].AsString;
                LItem.Data[TMultiDetailAppearanceNames.Detail3] := 'Stackable: ' + jItems['stackable'].AsString;
              end;
            end;
          end;
          frmMain.lvRustItems.EndUpdate;
        end);
    finally
      jdata.Free;
    end;
  finally
    http.Free;
  end;
end;
...