Italian [B4A][RISOLTO] Come posso prendere i dati con ItemClick da CustomListView collegata a Database SQL

3uowiS

Active Member
Licensed User
Ciao a tutti, sto imparando e sto creando la mia prima app.
Ho collegato un Database SQL ad una CustomListView e con il debug su smartphone sembra funzionare tutto bene.
Solo che non riesco a capire come prendere i dati quando si clicca su una oggetto della lista.

So che per voi sarà una domanda banale ma anche se so che devo usare il comando ItemClick, non so cosa chiedergli.
Potreste aiutarmi?

Di seguito vi metto il codice della Sub che interessa i dati da prelevare:
B4X:
Sub fill_clv (rs As ResultSet)
    xclv.Clear
    Do While rs.NextRow
        Dim p As B4XView = xui.CreatePanel("")
        p.LoadLayout("playerDb")
        p.SetLayoutAnimated(0,0,0,pnlPlayer.Width,pnlPlayer.Height)
       
        lblName.Text = rs.GetString("PlayerName")
        lblPos1.Text = rs.GetString("Pos1")
        lblPos2.Text = rs.GetString("Pos2")
        lblTeam.Text = rs.GetString("Team")
        lblGen.Text = rs.GetInt("GEN")
       
        xclv.Add(p,"")
    Loop
   
    rs.Close
End Sub
 

Sagenut

Well-Known Member
Licensed User
B4X:
Sub EventNamexclv_ItemClick (Index As Int, Value As Object)
    Dim PlayerName As String = xclv.GetPanel(Index).GetView(0).Text
    Dim Pos1 As String = xclv.GetPanel(Index).GetView(1).Text
    Dim Pos2 As String = xclv.GetPanel(Index).GetView(2).Text
    Dim Team As String = xclv.GetPanel(Index).GetView(3).Text
    Dim GEN As String = xclv.GetPanel(Index).GetView(4).Text
End Sub
Dovrai usare l'EventName della tua CustomListView per ItemClick.
Nell'esempio i GetView, da 0 a 4, potrebbero essere differenti dal tuo Layout.
Puoi sapere il numero da usare guardando il TreeView nel tuo Layout:
la View più in alto è la 0 e poi via a scendere.
Ho ipotizzato che nel Layout ci siano solo quelle 5 Labels.
E l'assegnazione a delle stringhe è puramente per esempio.
Potresti usare anche:
B4X:
Sub EventNamexclv_ItemClick (Index As Int, Value As Object)
    Dim PlayerName As Label = xclv.GetPanel(Index).GetView(0)
End Sub
in modo da poter lavorare direttamente sulla Label con tutte le sue funzioni.
 

Filippo

Expert
Licensed User
Ciao a tutti, sto imparando e sto creando la mia prima app.
Ho collegato un Database SQL ad una CustomListView e con il debug su smartphone sembra funzionare tutto bene.
Solo che non riesco a capire come prendere i dati quando si clicca su una oggetto della lista.

So che per voi sarà una domanda banale ma anche se so che devo usare il comando ItemClick, non so cosa chiedergli.
Potreste aiutarmi?

Di seguito vi metto il codice della Sub che interessa i dati da prelevare:
B4X:
Sub fill_clv (rs As ResultSet)
    xclv.Clear
    Do While rs.NextRow
        Dim p As B4XView = xui.CreatePanel("")
        p.LoadLayout("playerDb")
        p.SetLayoutAnimated(0,0,0,pnlPlayer.Width,pnlPlayer.Height)
      
        lblName.Text = rs.GetString("PlayerName")
        lblPos1.Text = rs.GetString("Pos1")
        lblPos2.Text = rs.GetString("Pos2")
        lblTeam.Text = rs.GetString("Team")
        lblGen.Text = rs.GetInt("GEN")
      
        xclv.Add(p,"")
    Loop
  
    rs.Close
End Sub
Al tuo posto io farei così:
B4X:
Sub fill_clv (rs As ResultSet)

    xclv.Clear

    Do While rs.NextRow

        Dim p As B4XView = xui.CreatePanel("")
        p.LoadLayout("playerDb")
        p.SetLayoutAnimated(0,0,0,pnlPlayer.Width,pnlPlayer.Height)    

        lblName.Text = rs.GetString("PlayerName")
        lblPos1.Text = rs.GetString("Pos1")
        lblPos2.Text = rs.GetString("Pos2")
        lblTeam.Text = rs.GetString("Team")
        lblGen.Text = rs.GetInt("GEN")      

        xclv.Add(p,  rs.GetInt("id") ) 'Id del Database

    Loop

    rs.Close
End Sub

'In questo modo non solo sai cosa contengono i Label, ma hai anche la possibilità di modificare il Database.
Sub EventNamexclv_ItemClick (Index As Int, Value As Object)
    Dim id As = Value 
End Sub

Però se a te questo non serve, allora puoi usare la funziona che @Sagenut ti ha indicato.
 

Filippo

Expert
Licensed User
L'evento ItemClick scatta soltanto se tocchi uno spazio dell'item in cui non ci siano delle view (le sue label), per cui l'evento da intercettare è sempre quello delle view, al limite anche quello della CustomListView, nel caso, raro, in cui ci fosse questo spazio libero (l'evento Label di @Sagenut non è corretto; Sage, dagli un'occhiata).
Non è tanto corretto!
Se togli tutti gli Eventi dei label, rimane solo quello della CustomListView, quindi non ci sono problemi. ;)
Cmq, le strade per arrivare a Roma sono molte, qual'é la più giusta?
 

LucaMs

Expert
Licensed User
Non è tanto corretto!
Se togli tutti gli Eventi dei label, rimane solo quello della CustomListView, quindi non ci sono problemi. ;)
Ho eliminato il mio post, prima della tua risposta, perché stavo per scrivere che... ora il tempo ce l'ho (annullata una "cosetta") ma non ho voglia di creare un esempio, perché lo farei strutturatissimo, "elasticissimo" e impiegherei un paio d'ore.

Immagino che tu intenda che se non scrivi le routine evento delle Label ma solo l'ItemClick della CustomListView questo scatti, ma non è così. Se non resci a toccare lo sfondo, il Panel, perché sopra hai tutte le view (Label, in questo caso) l'evento non scatta proprio.
 

Sagenut

Well-Known Member
Licensed User
Immagino che tu intenda che se non scrivi le routine evento delle Label ma solo l'ItemClick della CustomListView questo scatti, ma non è così. Se non resci a toccare lo sfondo, il Panel, perché sopra hai tutte le view (Label, in questo caso) l'evento non scatta proprio.
Ho fatto una prova al volo e funziona, proprio perchè non viene gestito nessun evento delle Labels.
Però potrei anche essermi sbagliato.
 

LucaMs

Expert
Licensed User
Ho fatto una prova al volo e funziona, proprio perchè non viene gestito nessun evento delle Labels.
Però potrei anche essermi sbagliato.
Hai detto bene: hai sbagliato ;)

Prova questo, prima lasciando "commentato" l'evento legato alle Label e poi... "decommentandolo".
 

Attachments

  • EventoCLVTest.zip
    15.6 KB · Views: 62

Sagenut

Well-Known Member
Licensed User
Continuo a credere che ti stai sbagliando tu o che stiamo parlando di cose diverse.
Anche nel tuo esempio:
- con l'evento Label_Click commentato scatta sempre il click sulla CLV (appare un Log del click sulla CLV).
- con l'evento Label_Click presente invece scatta l'evento della Label (appare un ToastMessage).
Non capisco quindi dove sia il mio errore.
 

Star-Dust

Expert
Licensed User
Anche penso sia una delle due ma non so quale
 

Filippo

Expert
Licensed User
Continuo a credere che ti stai sbagliando tu o che stiamo parlando di cose diverse.
Anche nel tuo esempio:
- con l'evento Label_Click commentato scatta sempre il click sulla CLV (appare un Log del click sulla CLV).
- con l'evento Label_Click presente invece scatta l'evento della Label (appare un ToastMessage).
Non capisco quindi dove sia il mio errore.
Il label lo devi creare così:
dim lblName as label
LlblName.initialize("") ' senza event
 

Filippo

Expert
Licensed User
E invece funziona, il che è del tutto sbagliato
Che cosa funziona, quello che dico io o quello che dici tu?
 

Sagenut

Well-Known Member
Licensed User
A me funziona anche se le Label hanno impostato l'EventName diverso da "".
Chiaramente non deve essere presente la Sub di gestione dell'evento delle Label.
Auguro a @3uowiS di risolvere.
 

LucaMs

Expert
Licensed User
Che cosa funziona, quello che dico io o quello che dici tu?
Quello che dici tu, ovvero non scrivere l'EventName nelle Label (anche se tu lo hai fatto, come esempio, da codice e io da Designer, funziona in entrambi i casi).
Però non ha senso, è sbagliato nel senso che sarebbe meglio che non funzionasse, non c'è logica.
 

LucaMs

Expert
Licensed User
Una nota che non c'entra un tubo con la questione in esame, ma visto che sto provando una cosa... ero curioso di vedere se ne funzionasse... un'altra 😁

Quando ancora non c'erano le B4XPages, se volevi serializzare un custom type, questo doveva essere dichiarato nell'Activity Main (in B4A, ovviamente) altrimenti non avrebbe funzionato.

Be' ero curioso di vedere se avrebbe funzionato dichiarando il Type nella B4XMainPage, così da non dover "toccare" l'Activity Main. Ebbene sì, funziona.
A quel punto mi sono domandato se funzionasse anche dichiarando dei Type nella altre B4XPage; e ancora sì - probabilmente, ma non certamente - perché poi dichiaro le pagine nella B4XMainPage.

Tutto questo perché avevo consigliato di usare un Custom Type per contenere i dati del record, eh, non a... "vanvAra".
 
Top