在Firemonkey中滚动后,ListBox项目发生了变化

时间:2016-07-06 08:18:49

标签: android scroll listbox firemonkey listboxitems

我正在开发Firemonkey中的多设备应用程序,其中Main类具有带有一些项目的ListBox组件。每个项目都具有相同的自定义样式。

我的问题是当我在ListBox中有这么多项目时,我必须滚动垂直以查看其余项目。在这种情况下,ListBox有一个奇怪的行为,当我向下滚动项目的组件(例如一个按钮)后,它已经改变了他的背景颜色,并且项目已经改变了他在ListBox内的顺序。

例如,如果我有:

  1. 第1项
  2. 第2项
  3. 第3项
  4. 滚动后我有了:

    1. 第2项
    2. 第3项
    3. 第1项
    4. 此更改是随机的。每次都不一样。

      真实示例(流程步骤):

      1. 将Main类加载到ListBox。
      2. enter image description here

        1. 垂直向下滚动以查看其余项目。

        2. 垂直向上滚动以返回列表顶部。

        3. enter image description here

          1. 项目已更改ListBox中的位置,按钮(每个项目的组件)更改其背景颜色。
          2. 为什么我在ListBox中有这种行为?我如何解决它并且ListBox不更改项目既没有命令他的组件的背景颜色?

            我不知道是否有任何属性可以阻止ListBox中的项目或类似的......

            修改

            这是创建和初始化ListBox项目的代码:

            procedure TRooms_Form.FormCreate(Sender: TObject);
            var
              ...
            begin
                i := 0;
                while i < numItems do begin
                  //Create ListBox item
                   item := TListBoxItem.Create(nil);
                   item.Parent := myListBox;
                   item.StyleLookup := 'styleLBox';
                  //Number
                   itemNumber := item.FindStyleResource('btt_number') as TButton;
                   if Assigned(itemNumber) then begin
                       itemNumber.Text := jsonNumber;
                       case jsonColor of
                         0 : itemNumber.TintObject.TintColor := TAlphaColors.Chocolate; 
                         1 : itemNumber.TintObject.TintColor := TAlphaColors.Gold;      
                         2 : itemNumber.TintObject.TintColor := TAlphaColors.Darkgreen; 
                         3 : itemNumber.TintObject.TintColor := TAlphaColors.Deeppink;  
                       end;
                     end;
                  //Title
                   itemTitle := item.FindStyleResource('txtstyle_title') as TText;
                   if Assigned(itemTitle) then begin
                     itemTitle.Text := jsonTitle;
                   end;
                  //Occupation
                   itemOccup := item.FindStyleResource('txt_occupation') as TText;
                   if Assigned(itemOccup) then begin
                     itemOccup.Text := jsonOccup;
                   end;
                  //Dates
                   itemDay := item.FindStyleResource('txt_day') as TText;
                   if Assigned(itemDay) then itemDay.Text := displayDay;
                   itemDateStart := item.FindStyleResource('txt_start') as TText;
                   if Assigned(itemDateStart) then itemDateStart.Text := jsonTimeStart;
                   itemDateEnd := item.FindStyleResource('txt_end') as TText;
                   if Assigned(itemDateEnd) then itemDateEnd.Text := jsonTimeEnd;
                  //Item background
                   itemBackgr := item.FindStyleResource('background_item') as TRectangle;
                   if Assigned(itemBackgr) then begin
                     itemBackgr.Fill.Kind := TBrushKind.Solid;
                     case jsonStatus of
                       0 : itemBackgr.Fill.Color := TAlphaColors.White;         
                       1 : itemBackgr.Fill.Color := TAlphaColors.Lightgreen;    
                       2 : itemBackgr.Fill.Color := TAlphaColors.Palegoldenrod; 
                       3 : itemBackgr.Fill.Color := TAlphaColors.Lightcoral;    
                       4 : itemBackgr.Fill.Color := TAlphaColors.Lightseagreen; 
                       5 : itemBackgr.Fill.Color := TAlphaColors.Lightblue;     
                       6 : itemBackgr.Fill.Color := TAlphaColors.Lightgrey;     
                     end;
                   end;
                  //Empty item
                   if (StrToInt(jsonEmpty) = 1) or (StrToInt(jsonNull) = 1) then begin
                     startDetail[i] := False;
                     if Assigned(itemNumber) then itemNumber.Visible := False;
                     if Assigned(itemOccup) then itemOccup.Visible := False;
                   end
                   else begin
                     startDetail[i] := True;
                   end;
            
                   Inc(i);
                end;
            

            非常感谢你的关注。

2 个答案:

答案 0 :(得分:1)

经过几天和一些测试,我已经找到了解决问题的方法。

我不明白为什么但是有些代码行干扰了我的自定义样式。

例如,当我把:

//Item background
   itemBackgr := item.FindStyleResource('background_item') as TRectangle;
   if Assigned(itemBackgr) then begin
     **itemBackgr.Fill.Kind := TBrushKind.Solid;**
     ...

滚动后,项目更改了订单位置及其颜色背景。我已将此属性直接应用于&#39; TRectangle&#39;自定义样式中的组件。

此外,我改变了所有元素的分配方式:

- 在我之前:

   itemTitle := item.FindStyleResource('txtstyle_title') as TText;
   if Assigned(itemTitle) then begin
     itemTitle.Text := jsonTitle;
   end;

- 我有:

   item.StylesData['txtstyle_title'] := jsonTitle;

通过这些更改,我得到的项目在滚动后不会改变它们在ListBox中的位置和背景颜色。

我还有一个问题,按钮没有显示背景颜色,这是由于以下几行:

//Empty item
   if (StrToInt(jsonEmpty) = 1) or (StrToInt(jsonNull) = 1) then begin
     startDetail[i] := False;
     **if Assigned(itemNumber) then itemNumber.Visible := False;**
     **if Assigned(itemOccup) then itemOccup.Visible := False;**
   end
   else begin
     startDetail[i] := True;
   end;

显然,您无法在&#39; FormCreate&#39;中的项目中更改可见属性方法,因为当你滚动一些项目元素时,无需控制即可更改其属性。因此,我在代码中做了一些修改,而不是假设可见性:

    if (StrToInt(jsonEmpty) = 1) or (StrToInt(jsonNull) = 1) then begin
      startDetail[i] := False;
      item.StylesData['btt_number.Text'] := '';
      item.StylesData['txt_occupation'] := '';
      if (StrToInt(jsonEmpty) = 1) then item.StylesData['btt_number.TintObject.TintColor'] := TAlphaColors.White;
      if (StrToInt(jsonNull) = 1) then item.StylesData['btt_number.TintObject.TintColor'] := TAlphaColors.Lightblue;
    end
    else begin
      startDetail[i] := True;
      item.StylesData['btt_number.Text'] := jsonNumber;
      item.StylesData['txt_occupation'] := jsonOccup;
    end;

在这种形式下,我把文字&#39; &#39; (空)和背景颜色与元素中的项目(TRectangle)颜色相同,应该将可见属性设置为false。

在完成所有这些更改后,我得到了我想要的结果,也就是说,滚动时我的项目ListBox不会改变。 XD

答案 1 :(得分:0)

将表单上的样书更改为 Resourse1 对我有帮助。