Spanish [SOLUCIONADO]TabStrip Dinamico

Jorgelcr

Active Member
Licensed User
Longtime User
Hola,

Estoy tratando de generar unas pestañas (Dias de Actos), que muestren el contenido (Hora y Acto) guardados en una BD MySql.
Quiero utilizar el mismo Layout para todas pestañas.
Con el siguiente codigo consigo crear las pestañas pero el contenido sólo lo muestra en la última pestaña.

B4X:
Sub JobDone(Job As HttpJob)
  
    Select Job.JobName
        Case "DIASACTOS"
            If Job.Success Then
                Dim res As String
                res = Job.GetString
                Dim parser As JSONParser
                parser.Initialize(res)
                COUNTRIES = parser.NextArray 'returns a list with maps  
                result.Initialize
                Dim url As String
                Dim cont As Int
                For i = 0 To COUNTRIES.Size - 1
                    m = COUNTRIES.Get(i)                      
                    TabStrip1.LoadLayout("PAGE4", m.Get("Titulo"))      
                Next
              
              
            End If
        Case "ACTOS"
          
            If Job.Success Then
              
                Dim res As String
                res = Job.GetString
                'Log("Response from server: " & res)
                Dim parser As JSONParser
                parser.Initialize(res)
                COUNTRIES = parser.NextArray 'returns a list with maps  
                result.Initialize
                Dim url As String
                Dim horaacto As String
              
                For i = 0 To COUNTRIES.Size - 1
                    m = COUNTRIES.Get(i)  
                    If     m.Get("Hora")=Null Then
                        horaacto=""
                    Else
                        horaacto=m.Get("Hora")  
                    End If
                    CustomListView1.Add(CreateListItem(horaacto,m.Get("Descripcion"),50dip,50dip),50dip,"")  
                  
                Next
            End If
    End Select
  
  
  
    Job.Release
End Sub

Sub TabStrip1_PageSelected (Position As Int)
  
    CustomListView1.Clear
    Dim sql As String
  
    sql="Select * From Actos Where Localidad = 'ZZZ' Order By CodigoActo ASC "
  
    ExecuteRemoteQuery(sql , "ACTOS")
  
End Sub

Sub CreateListItem(Text1 As String, Text2 As String, Width As Int, altura As Int) As Panel
    Dim p As Panel
    p.Initialize("")
    p.Color = Colors.White
        Dim lbl As Label
    lbl.Initialize("")
    'lbl.Gravity = Bit.Or(Gravity.CENTER_VERTICAL, Gravity.LEFT)
    lbl.Gravity = Bit.Or(Gravity.TOP,Gravity.LEFT)
    lbl.Text = Text1
    lbl.TextSize = 16
    lbl.TextColor = Colors.Black
   
        Dim lbl2 As Label
    lbl2.Initialize("")
    'lbl2.Gravity = Bit.Or(Gravity.CENTER_VERTICAL, Gravity.LEFT)
    lbl2.Gravity = Bit.Or(Gravity.TOP,Gravity.LEFT)
    lbl2.Text = Text2
    lbl2.TextSize = 16
    lbl2.TextColor = Colors.Black
       

    p.AddView(lbl, 5dip, 2dip, 90dip, height - 4dip) 
    p.AddView(lbl2, 100dip, 2dip, 250dip, height - 4dip)
     
   
    Return p
End Sub
 
Last edited:

Jorgelcr

Active Member
Licensed User
Longtime User
Hola,

No sé si alguien lo ha visto, si puede ayudarme o si no me han entendido.
Necesito alguna sugerencia!!
 

JordiCP

Expert
Licensed User
Longtime User
El "CustomListView1" es parte del layout que cargas en todas las pestañas?
 

Jorgelcr

Active Member
Licensed User
Longtime User
Si, mi idea es tener un sólo layout con un CustomListView y cambiar el contenido en función de la pestaña en la que estoy posicionado.
Lo quiero hacer así ya que no quiero crear un layout por cada pestaña ya que el número de pestañas puede cambiar en función de los datos almacenados en la tabla.
 

JordiCP

Expert
Licensed User
Longtime User
El problema es que la variable de código "CustomListView1" no se puede redirigir "automaticamente" a la pestaña que esté activa. Esto te sucederá para el CustomListView y para todos los otros elementos que tengas en el layout.

Es decir:
  • Por un lado tienes el layout, con los mismos nombres de elementos, que cargas en diferentes pestañas.
  • Por otro lado, tienes una variable en código, "CustomListView1", que el sistema asume directamente que es el que has cargado del layout.
  • Pero, cada vez que vas cargando el layout en diferentes pestañas, el sistema va asumiendo, que la variable de código se refiere al último que has cargado.
  • Si es así, tiene sentido que sólo se llene la última pestaña.

Podrías probar lo siguiente:
a) cada vez que se selecciona una pestaña, fuerza que se vuelva a cargar el layout de la misma. Así, las variables del código estarán referenciadas a la página activa. Después llenas con los datos que sean.
b) en vez de cargar layout, si éste no es muy complejo, genéralo por código. Así el CustomListView1 de cada pestaña podrá tener un nombre diferente (por ejemplo, creas un array)
 

JordiCP

Expert
Licensed User
Longtime User
Si el que estás utilizando es el TabStripViewPager, creo que sólo se pueden cargar layouts por código. Entonces la opción (b) no se puede hacer

La (a) es una opción. Pero creo que ésta es incluso mejor. Te paso el código de ejemplo de Erel (de aquí) modificado

Primera modificación (respecto al ejemplo): cargamos en las tres páginas el mismo layout (PAge3) y luego llenamos el listview. Verás que sólo se llena el tercero.
B4X:
Sub Globals
   'These global variables will be redeclared each time the activity is created.
   'These variables can only be accessed from this module.

   Private TabStrip1 As TabStrip
   Private Page3ListView1 As ListView
   
   Dim myPage3ListView1(3) As ListView
End Sub

Sub Activity_Create(FirstTime As Boolean)
   Activity.LoadLayout("Main")
   TabStrip1.LoadLayout("Page3", "PAGE 1")                   '<---- Cargamos el mismo layout en las 3 páginas!!
   TabStrip1.LoadLayout("Page3", "THIS IS PAGE 2")
   TabStrip1.LoadLayout("Page3", "AND PAGE 3")

   For i = 1 To 100
     Page3ListView1.AddSingleLine($"Item ${i}"$)  '<--- verás que sólo se carga el tercero.
   Next

   Activity.AddMenuItem("Jump to page 1", "mnu1")
   Activity.AddMenuItem("Jump to page 2", "mnu2")
   Activity.AddMenuItem("Jump to page 3", "mnu3")
End Sub

Ahora hacemos lo mismo (cargamos el mismo layout en las tres páginas) pero después de cargar cada una anotamos la referencia del listview en aquel momento (mediante el array)
Después podemos modificar el que queramos accediendo al indice del array que queramos
B4X:
Sub Globals
   'These global variables will be redeclared each time the activity is created.
   'These variables can only be accessed from this module.

   Private TabStrip1 As TabStrip
   Private Page3ListView1 As ListView
   
   Dim myPage3ListView1(3) As ListView
End Sub

Sub Activity_Create(FirstTime As Boolean)
   Activity.LoadLayout("Main")
   TabStrip1.LoadLayout("Page3", "PAGE 1")
   myPage3ListView1(0)=Page3ListView1         '<---- Tomamos referencia del lisview de la primera pagina
   TabStrip1.LoadLayout("Page3", "THIS IS PAGE 2")
   myPage3ListView1(1)=Page3ListView1         '<---- ahora del de la segunda
   TabStrip1.LoadLayout("Page3", "AND PAGE 3")
   myPage3ListView1(2)=Page3ListView1         '<---- ahora del de la tercera
   
   For k=0 To 2
   For i = 1 To 100
     myPage3ListView1(k).AddSingleLine($"Item ${i}"$)  '<--- estamos llenando el listiew de la página "k"
   Next
   Next
   Activity.AddMenuItem("Jump to page 1", "mnu1")
   Activity.AddMenuItem("Jump to page 2", "mnu2")
   Activity.AddMenuItem("Jump to page 3", "mnu3")
End Sub

De todas maneras, si hay mas elementos y/o eventos por medio, quizásno sea suficiente con esto.
 

Jorgelcr

Active Member
Licensed User
Longtime User
Hola,

Lo primero de todo gracias por contestarme.
En el ejemplo que me indicas me pones un listview pero yo estoy trabajando con un customlistview ya que muestro varias columnas.
Si intento adaptar tu ejemplo de listview a customlistview, me da error la siguiente linea, ya que no me deja declararla
CustomListView1(i)=CustomListView1

Alguna opcion?
 

JordiCP

Expert
Licensed User
Longtime User
No puedes declarar CustomlistView1() con el mismo nombre que CustomListView1 del layout. Verás que en mi ejemplo añadía el prefijo "my". Deberías cambiar el nombre del array de manera parecida.
 

JordiCP

Expert
Licensed User
Longtime User
Me alegro!
Como te dije, depende de què quieras hacer con los layouts (si modificarlos dinamicamente u otros) quizás aparezcan problemas adicionales por hacerlo de esta manera. Pero creo que todos son solventables.
 
Cookies are required to use this site. You must accept them to continue using the site. Learn more…