android scroll listbox firemonkey listboxitems

android - Los elementos de ListBox cambian después de hacer scroll en Firemonkey



listboxitems (1)

Estoy desarrollando una aplicación de dispositivos múltiples en Firemonkey, donde la clase principal tiene un componente ListBox con algunos elementos. Cada uno de estos elementos tiene el mismo estilo personalizado.

Mi problema es cuando tengo tantos elementos en el ListBox y tengo que desplazarme verticalmente para ver el resto de los elementos. En este caso, el ListBox tiene un comportamiento extraño y cuando me desplazo hacia arriba después de desplazarme hacia abajo los componentes del elemento (un botón por ejemplo) han cambiado su color de fondo y los elementos han cambiado su orden dentro de ListBox.

Por ejemplo, si tuviera:

  1. Artículo 1
  2. Artículo 2
  3. Artículo 3

después de hacer scroll tengo:

  1. Artículo 2
  2. Artículo 3
  3. Artículo 1

Este cambio es aleatorio. Cada vez es diferente.

Ejemplo real (pasos de proceso):

  1. Cargue la clase principal donde está ListBox.

  1. Haz scroll vertical hacia abajo para ver el resto de los elementos.

  2. Haga un desplazamiento vertical hacia arriba para volver al inicio de la lista.

  1. Los elementos han cambiado de posición en el ListBox y el botón (componente de cada elemento) cambia su color de fondo.

¿Por qué tengo este comportamiento en el ListBox? ¿Cómo puedo resolverlo y el ListBox no cambia los artículos? ¿Pide el color de fondo de sus componentes?

No sé si hay alguna propiedad para bloquear elementos dentro de ListBox o similar ...

EDITAR

Este es el código para crear e inicializar los elementos de 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;

Muchas gracias por su atención.


Después de algunos días y algunas pruebas, ya encontré una solución a mi problema.

No entiendo bien por qué, pero había algunas líneas de código que interferían con mi estilo personalizado.

Por ejemplo, cuando puse:

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

Después del desplazamiento, los elementos cambiaron la posición del pedido y su fondo de color. He aplicado esta propiedad directamente en el componente ''TRectangle'' en el estilo personalizado.

Además, cambié la asignación de todos los elementos de esta manera:

-Antes tuve:

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

-Ahora tengo:

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

Con estos cambios, los elementos que obtengo no cambian su posición en ListBox ni el color de fondo después del desplazamiento.

Todavía tengo un problema, los botones no muestran el color de fondo y se debe a estas líneas:

//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;

Aparentemente, no se puede cambiar la propiedad visible del elemento en el método ''FormCreate'' porque cuando se desplazan algunos elementos, los elementos cambian su propiedad sin control. Por lo tanto, he hecho algunas modificaciones en mi código en lugar de poner a falso la visibilidad:

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;

En esta forma, puse el texto '''' (vacío) y el color de fondo en el mismo color que su elemento (TRectangle) en los elementos que deberían tener la propiedad visible a falso.

Después de todos estos cambios obtengo el resultado que quería, es decir, mis elementos ListBox no cambian cuando me desplazo. XD