Italian Creazione menù dinamico

ildalla83

Member
Licensed User
Ciao a tutti. La mia app riceve una serie di voci di menù da un database, tramite web service.
Vorrei creare una struttura dinamica che si alimenta in base ai dati ricevuti.
upload_2017-12-18_16-18-56.png

Questa è la mia webapp funzionante che già si comporta in questo modo. Le prima 4 voci sono fisse, mentre le successive (di colore blu) sono generate in modo dinamico.
Vorrei capire come posso fare la stessa cosa sulla mia app. Che controlli dovrei utilizzare?
Grazie
Ciao
 

ildalla83

Member
Licensed User
Puoi indicarmi qualche esempio? Perchè sulla teoria mi ero fatto anche io la stessa idea... il problema è la pratica :)
 

MarcoRome

Expert
Licensed User
Longtime User
B4X:
Dim i As Int
Dim altezza As Int = 4dip
    For i = 1 To 22
        Dim btnInside As Button
        btnInside.Initialize("btnInside")
        btnInside.Tag = i
        'btnInside.Text = "Inside Button #" & i
        
        Dim c2 As ColorDrawable
        c2.Initialize2(Colors.ARGB(200, 226, 211, 178),5dip,1dip,Colors.Black)
        btnInside.Background = c2
            
        Dim cs As CSBuilder
        cs.Initialize 
        cs.Image(LoadBitmap(File.DirAssets, "xxx.png"), 80dip, 80dip, False).Append(CRLF).Append($"${i}"$).Append(CRLF).Append(CRLF)
        cs.PopAll
        btnInside.Text = cs
        
        
        If Not(i Mod 2 = 0) Then
            ScrollView1.Panel.AddView(btnInside, 3dip , altezza,ScrollView1.Width / 2, ScrollView1.Width / 2)
        Else
            ScrollView1.Panel.AddView(btnInside, ScrollView1.Width / 2 , altezza,ScrollView1.Width / 2, ScrollView1.Width / 2)
            altezza = altezza + ScrollView1.Width / 2
            ScrollView1.Panel.Height = altezza + ScrollView1.Width / 2
        End If
        
        
        ScrollView1.Panel.Invalidate
    Next
 

ildalla83

Member
Licensed User
[Crea un layout per ogni tasto e caricalo in un panel]
E' possibile avere un esempio di questa soluzione?

Dim i As Int
Dim altezza As Int = 4dip
For i = 1 To 22
Dim btnInside As Button
btnInside.Initialize("btnInside")
btnInside.Tag = i
'btnInside.Text = "Inside Button #" & i

Dim c2 As ColorDrawable
c2.Initialize2(Colors.ARGB(200, 226, 211, 178),5dip,1dip,Colors.Black)
btnInside.Background = c2

Dim cs As CSBuilder
cs.Initialize
cs.Image(
LoadBitmap(File.DirAssets, "xxx.png"), 80dip, 80dip, False).Append(CRLF).Append($"${i}"$).Append(CRLF).Append(CRLF)
cs.PopAll
btnInside.Text = cs


If Not(i Mod 2 = 0) Then
ScrollView1.Panel.AddView(btnInside, 3dip , altezza,ScrollView1.Width / 2, ScrollView1.Width / 2)
Else
ScrollView1.Panel.AddView(btnInside, ScrollView1.Width / 2 , altezza,ScrollView1.Width / 2, ScrollView1.Width / 2)
altezza = altezza + ScrollView1.Width /
2
ScrollView1.Panel.Height = altezza + ScrollView1.Width / 2
End If


ScrollView1.Panel.Invalidate
Next
Grazie questo lo terrò come piano B
 

MarcoRome

Expert
Licensed User
Longtime User
Con il codice che ti ho incollato, puoi creare una lista variabile di n. oggetti senza dover creare un layout per ogni tasto. Devi creare un solo layout con una scrollview, la stessa verrà ridimensionata in base ai pulsanti inseriti. Fai tu...
 

ildalla83

Member
Licensed User
Si è vero, ma utilizzando i button sono costretto a stare alle regole del controllo. Mentre io voglio creare una layout personalizzata per riprodurre quanto più fedelmente possibile l'immagine che ho postato sopra. Ad esempio il numerino deve stare in basso a destra, non devo avere i bordi neri e così via...
 

LucaMs

Expert
Licensed User
Longtime User
LucaMs said:
[Crea un layout per ogni tasto e caricalo in un panel]
E' possibile avere un esempio di questa soluzione?

Quello che ti ho indicato io è per creare uno dei "tasti" che tu hai pubblicato:
upload_2017-12-18_17-12-16.png


Crei un layout che contiene una ImageView e due label.

Poi, secondo quale oggetto "contenitore di tutti i tasti" utilizzi, crei un panel per ogni "tasto", e ci carichi il layout. Poi devi poter gestire l'evento click per quel tasto; puoi farlo in due modi diversi, mettendo nello stesso layout un panel trasparente sopra le 3 view (metodo migliore) oppure dare alle 3 view lo stesso nome evento.

Dopodiché, puoi usare una ScrollView in cui aggiungi dinamicamente i vari "tasti" (pannelli) oppure una CustomListView, in cui ogni item sarà composto ad esempio da 3 panel che riempirai con il layout di cui sopra.

Insomma, più difficile da spiegare che da fare
 

udg

Expert
Licensed User
Longtime User
Potresti dare una rapida lettura a questo thread. Se non ricordo male ci sono diversi punti in comune.
 
Top