Spanish Recorrer Customlistview y obtener los valores de las diferentes celdas

Johnny Wing Pérez

Member
Licensed User
Saludos compañeros.
Alguien me puede explicar como se puede obtener los valores de un customlistview, es decir, tengo este cuadro:

IDNombreCantidadPrecioTotal
1​
Pera
2​
55​
110​
2​
Melón
1​
105​
105​
3​
Sandia
2​
610​
1220​
4​
Mango
3​
65​
195​
Como puedo ir recorriendo el mismo y obtener los valores contenidos en cada celda, por ejemplo:
Id=1, Nombre=Pera,Cantidad=2,Precio=55,Total=110
Id=2,Nombre=Melón,Cantidad=1,Precio=105,Total=105

Muchas Gracias.
 

Alberto Michelis

Well-Known Member
Licensed User
Longtime User
Proba con esto:
B4X:
    Dim index As Int
    index = Precios.GetItemFromView(Sender)
    Dim pnl As Panel
    pnl = Precios.GetPanel(index)
    Dim ID As Label
    ID = pnl.GetView(0)
    ....
 

Johnny Wing Pérez

Member
Licensed User
[CODE lang = "b4x" title = "B4x"] Sub MostrarLista2
Dim Datos como lista
Clv1.Clear ()
Dim xui como XUI
Datos = mascota.SelectAll ("")
Para i = 0 a Datos.Size -1
Dim p As B4XView = xui.CreatePanel ("")
p.SetLayoutAnimated (0,0,0,100% x, 90dip)
p.LoadLayout ("Artículo")
Dim R como Mascota
R = Datos.Obtener (i)
Label1.Text = R.Id
Label2.Text = R.Nombre
Label3.Text = R.Edad
Label4.Text = R.Raza
Clv1.Add (p, R.Id)
próximo
End Sub
[/ CÓDIGO]

es el código que utilizo para crear mi customlistview lo que deseo es posteriormente poder recorrerlo. Gracias
 

jose luis gudino

Active Member
Licensed User
Longtime User
Hola.
Por ejemplo , tienes varios CLV
y en cada unos quieres buscar un label determinado y cambiar el valor
quedaria asi:

B4X:
For i = 0 To clv.Size -1
    Dim p As B4XView = clv.GetPanel(i)
    If p.NumberOfViews > 0 Then
     'asumiendo que: el getview(2) corresponde a la etiqueta que quieres cambiar
     'puedes usar la ventana de depuracion que posicion tiene la etiquetas que andas buscando
     Dim label As B4XView = p.GetView(0).GetView(2)
     label.text ="nuevo valor"
    end if
next
 

Johnny Wing Pérez

Member
Licensed User
[CITA = "jose luis gudino, publicación: 728341, miembro: 54655"]
Hola.
Por ejemplo, tienes varios CLV
y en cada uno quieres buscar una etiqueta determinar y cambiar el valor
quedaria asi:

[CÓDIGO = b4x] Para i = 0 Para clv.Size -1
Dim p As B4XView = clv.GetPanel (i)
Si p.NumberOfViews> 0 Entonces
'asumiendo que: el getview (2) corresponde a la etiqueta que quieres cambiar
'puedes usar la ventana de depuración que la posición tiene las etiquetas que andas buscando
Etiqueta tenue como B4XView = p. GetView (0). GetView (2)
label.text = "nuevo valor"
terminara si
siguiente [/ CÓDIGO]
[/CITAR]

[CITA] [/ CITA]Muchas gracias, de hecho ese mismo ejemplo fue el que encontré en un hilo de Erel y trabaja perfectamente.
 

josejad

Expert
Licensed User
Longtime User
Hola Johnny:

Parece que donde escribes te traduce a castellano automáticamente lo que escribes y las etiquetas CODE te las traduce a CÓDIGO y no se ve bien.
Como te ha indicado José Luis es una buena forma de acceder a los elementos de un CLV, digamos que la forma más genérica, porque vas accediendo a cada vista del CLV (recuerda que el orden de las vistas, es el orden que tienen en el diseñador.)
Por ejemplo, aquí, del pnlTitle, lblTitle sería la vista 0 (pnlTitle.Getview(0)), e ImageView1 la 1 (pnlTitle.Getview(1))
Es decir

1587324032827.png


Es muy útil en estos casos usar la propiedad Tag de los elementos.
Por ejemplo en este caso si en tu código haces:
B4X:
Sub MostrarLista2
Dim Datos como lista
Clv1.Clear ()
Dim xui como XUI
Datos = mascota.SelectAll ("")
Para i = 0 a Datos.Size -1
Dim p As B4XView = xui.CreatePanel ("")
p.SetLayoutAnimated (0,0,0,100% x, 90dip)
p.LoadLayout ("Artículo")
Dim R como Mascota
R = Datos.Obtener (i)
Label1.Text = R.Id
Label2.Text = R.Nombre
Label3.Text = R.Edad
Label4.Text = R.Raza
p.Tag = R     '<-------------------- Añades esta línea, y al Tag (etiqueta) de tu panel, le añade tu tipo Mascota
Clv1.Add (p, R)   '<------------  Creo que si aquí, en vez de enviar solo el ID, envías el tipo entero, luego ya tienes todos sus valores cuando hagas click en el CLV)
próximo
End Sub

For i = 0 To clv.Size -1
    Dim p As B4XView = clv.GetPanel(i)
    If p.NumberOfViews > 0 Then
     Dim R as Mascota = p.Tag 'Aquí ya tendrías todos los valores
     Dim label As B4XView
     label.text = R.id
    end if
next

Si asignas como te puesto arriba tu objeto mascota en vez de sólo el ID, en el evento ItemClick podrías recuperar todos sus valores.
B4X:
Sub CLV1_ItemClick (Index As Int, Value As Object)
   Dim R as Mascota = Value
   Log(R), ya aquí tendrías todos los valores para trabajar con ellos (R.Id, ....)
End Sub

End Sub
 

Johnny Wing Pérez

Member
Licensed User
Hola Johnny:

Parece que donde escribes te traduce a castellano automáticamente lo que escribes y las etiquetas CODE te las traduce a CÓDIGO y no se ve bien.
Como te ha indicado José Luis es una buena forma de acceder a los elementos de un CLV, digamos que la forma más genérica, porque vas accediendo a cada vista del CLV (recuerda que el orden de las vistas, es el orden que tienen en el diseñador.)
Por ejemplo, aquí, del pnlTitle, lblTitle sería la vista 0 (pnlTitle.Getview(0)), e ImageView1 la 1 (pnlTitle.Getview(1))
Es decir

View attachment 92110

Es muy útil en estos casos usar la propiedad Tag de los elementos.
Por ejemplo en este caso si en tu código haces:
B4X:
Sub MostrarLista2
Dim Datos como lista
Clv1.Clear ()
Dim xui como XUI
Datos = mascota.SelectAll ("")
Para i = 0 a Datos.Size -1
Dim p As B4XView = xui.CreatePanel ("")
p.SetLayoutAnimated (0,0,0,100% x, 90dip)
p.LoadLayout ("Artículo")
Dim R como Mascota
R = Datos.Obtener (i)
Label1.Text = R.Id
Label2.Text = R.Nombre
Label3.Text = R.Edad
Label4.Text = R.Raza
p.Tag = R     '<-------------------- Añades esta línea, y al Tag (etiqueta) de tu panel, le añade tu tipo Mascota
Clv1.Add (p, R)   '<------------  Creo que si aquí, en vez de enviar solo el ID, envías el tipo entero, luego ya tienes todos sus valores cuando hagas click en el CLV)
próximo
End Sub

For i = 0 To clv.Size -1
    Dim p As B4XView = clv.GetPanel(i)
    If p.NumberOfViews > 0 Then
     Dim R as Mascota = p.Tag 'Aquí ya tendrías todos los valores
     Dim label As B4XView
     label.text = R.id
    end if
next

Si asignas como te puesto arriba tu objeto mascota en vez de sólo el ID, en el evento ItemClick podrías recuperar todos sus valores.
B4X:
Sub CLV1_ItemClick (Index As Int, Value As Object)
   Dim R as Mascota = Value
   Log(R), ya aquí tendrías todos los valores para trabajar con ellos (R.Id, ....)
End Sub

End Sub

Excelente José muchas gracias por los ejemplos y las sugerencias.
 

edochan

Member
Licensed User
Longtime User
Perdonad a un pobre (y eterno) iniciado.
Quisiera correr este ejemplo como una aplicación nueva para ver como se genera el CLV, y luego adaptarlo a la que yo necesito, (que es incluir en cada linea del CLV dos labels y un CheckBox al final). Debo ser un inútil, pero para mi está siendo una odisea comprender como. Llevo 3 días leyendo ejemplos y no consigo hacer nada, todos son mucho más complejos de lo que yo necesito.
Por ejemplo, me podríais decir que es R en la linea "Dim R como Mascota" = Dim R As ... ¿ListView? ¿CustomListView? 🤔
Y... que deberá tener en el Sub Process_Globals y en el Sub Globals
Solo os pido un ejemplo muuuuy sencillo, pero funcional. Luego ya tratare de trasladarlo yo mismo.
¿Puede ser?
Muchas gracias.
 

josejad

Expert
Licensed User
Longtime User
Hola erdochan:

Por favor, crea un hilo nuevo para tu consulta. Lo que preguntas no tiene nada que ver con el titulo del hilo de cómo recorrer un customlistview.

Has visto el hilo original, visto el video y/o descargado elmejemplo del xCustomListview original?
En el Erel crea un xCLV y carga en cada item un sencillo layout.
Si modificas ese layout tendrias lo que quieres.

por favor, cualquier duda, crea un hilo nuevo con el titulo apropiado

 

josejad

Expert
Licensed User
Longtime User
Nada que disculpar, es solo para que el foro esté más claro. Cualquier cosa, aquí estamos.
 
Top