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

Sagenut

Well-Known Member
Licensed User
@Filippo non ti fare sempre desiderare!
Intervieni prima! 不 不 不
 

Sagenut

Well-Known Member
Licensed User
Ma voi a parte anni di esperienza (che vogliono dire tanto), come avete imparato tutte queste cose?
Qualche esperienza con altri linguaggi (sempre base Basic).
Ma io lo faccio come passatempo quindi ho tantissimo da imparare come te.
Io al momento ho fatto 2 corsi di B4A su Udemy che mi hanno dato le basi e insegnato come muovermi, ma partivo da zero e vedo che tante cose sono ancora arabo per me e non so se riuscir簷 da solo ad andare fino in fondo a questo progetto. Un corso sul linguaggio Basic potrebbe aiutare?
Hai fatto benissimo a fare i corsi.
Tante cose che ora sono Arabo diventeranno pi羅 chiare a mano a mano che chiarisci alcuni concetti di base che poi tenderanno a ripetersi.
L'importante 癡 che quando trovi, o ti forniscono, codice che funziona e risolve una tua necessit tu non ti limiti a copiarlo e basta.
Devi prenderti il tempo di capire perch癡 quella cosa funziona cos穫.
Poi si pu簷 arrivare ad uno stesso risultato in maniere diverse, che quindi sono tutte giuste fondamentalmente ma ce ne saranno sempre alcune migliori in termini di velocit o semplicit del codice.
C'癡 sempre tempo per mettere mano anche a vecchi codici quando impari nuove istruzioni e metodi.
Un corso di Basic potrebbe anche esserti utile ma al momento puoi cercare/studiare quel che ti serve volta per volta e capirlo.
Il tuo progetto in qualche modo lo finirai, poi lo migliorerai.
Ma non devi avere fretta e non ridurti solo a copiare e incollare codice.
 

3uowiS

Active Member
Licensed User
io penso che cos穫 dovrebbe funzionare.
B4X:
xclv.Add(p, rs.getstring("ID"))

Private Sub xclv_ItemLongClick (Index As Int, Value As Object)
    cur = Starter.sqlPlayers.ExecQuery("Select Gen, Pos1, Pos2 from PLAYERS WHERE ID='"& Value & "'")
    Log(cur.GetString("Pos1"))
    Gen = rs.GetInt("Gen")
    Pos1 = cur.GetString("Pos1")
    Pos2 = cur.GetString("Pos2")
End Sub
@Filippo grazie, ma purtroppo mi crasha al primo CurGetString con questo errore: "android.database.CursorIndexOutOfBoundsException: Index -1 requested, with a size of 1" Sai a cosa si riferisce?

Questo 癡 il codice che ho: (cur 癡 dichiarato in Globals)
B4X:
Private Sub xclv_ItemLongClick (Index As Int, Value As Object)
    
    Dim Gen As Int
    Dim Pos1 As String
    Dim Pos2 As String
    
    cur = Starter.sqlPlayers.ExecQuery("Select GEN, Pos1, Pos2 from PLAYERS WHERE ID='"& Value & "'")

    Pos1 = cur.GetString("Pos1")
    Pos2 = cur.GetString("Pos2")
    Gen = cur.GetInt("GEN")
    
    id = Value
    
    Log(id)
    Log(Pos1)
    Log(Pos2)
    Log(Gen)

End Sub
 

3uowiS

Active Member
Licensed User
Qualche esperienza con altri linguaggi (sempre base Basic).
Ma io lo faccio come passatempo quindi ho tantissimo da imparare come te.

Hai fatto benissimo a fare i corsi.
Tante cose che ora sono Arabo diventeranno pi羅 chiare a mano a mano che chiarisci alcuni concetti di base che poi tenderanno a ripetersi.
L'importante 癡 che quando trovi, o ti forniscono, codice che funziona e risolve una tua necessit tu non ti limiti a copiarlo e basta.
Devi prenderti il tempo di capire perch癡 quella cosa funziona cos穫.
Poi si pu簷 arrivare ad uno stesso risultato in maniere diverse, che quindi sono tutte giuste fondamentalmente ma ce ne saranno sempre alcune migliori in termini di velocit o semplicit del codice.
C'癡 sempre tempo per mettere mano anche a vecchi codici quando impari nuove istruzioni e metodi.
Un corso di Basic potrebbe anche esserti utile ma al momento puoi cercare/studiare quel che ti serve volta per volta e capirlo.
Il tuo progetto in qualche modo lo finirai, poi lo migliorerai.
Ma non devi avere fretta e non ridurti solo a copiare e incollare codice.
Grazie mille per i consigli @Sagenut! Sono preziosi! Si, per come sono fatto io non mi limito a copiare il codice, considera che quando chiedo aiuto qui solitamente sono gi stato diverso tempo a batterci la testa proprio per cercare di capirne il meccanismo e arrivare alla soluzione da solo.
Spero di riuscire davvero a portare a termine questo progetto, anche se ci volessero mesi e mesi perch矇 ci tengo molto, ma sono anche consapevole che sia un app abbastanza complessa da realizzare. Quindi via via mi vedrete sicuramente chiedere altre cose.
 

Filippo

Expert
Licensed User
@Filippo grazie, ma purtroppo mi crasha al primo CurGetString con questo errore: "android.database.CursorIndexOutOfBoundsException: Index -1 requested, with a size of 1" Sai a cosa si riferisce?
metti un log(Value) prima della riga
B4X:
cur = Starter.sqlPlayers.ExecQuery("Select GEN, Pos1, Pos2 from PLAYERS WHERE ID='"& Value & "'")
e guarda qual'癡 il valore. Se 癡 -1, allora l'errore ci st.
 

3uowiS

Active Member
Licensed User
metti un log(Value) prima della riga
B4X:
cur = Starter.sqlPlayers.ExecQuery("Select GEN, Pos1, Pos2 from PLAYERS WHERE ID='"& Value & "'")
e guarda qual'癡 il valore. Se 癡 -1, allora l'errore ci st.
Avevo gi provato, ma con Value mi da l'ID che 癡 alfanumerico (ad esempio: "BealBr1"). Ho provato anche a mettere il log di Index e mi da un numero che corrisponde al numero della riga (ad esempio 5 che 癡 la sesta riga) ma di -1 non ne ho.
 

Filippo

Expert
Licensed User
qual'癡 il valore di quello che inserisci qui?
log(rs.getstring("ID"))
B4X:
xclv.Add(p, rs.getstring("ID"))
se questo corrisponde ad es. a "BealBr1", allora non pu簷 funzionare.
 

3uowiS

Active Member
Licensed User
qual'癡 il valore di quello che inserisci qui?
log(rs.getstring("ID"))
B4X:
xclv.Add(p, rs.getstring("ID"))
se questo corrisponde ad es. a "BealBr1", allora non pu簷 funzionare.
Si esatto, 癡 una string e corrisponde ad un codice alfanumerico come quello. Perch矇 non pu簷 funzionare? cur funziona solo con i numeri? E se uso rs 癡 lo stesso?
 

Sagenut

Well-Known Member
Licensed User
Resta il fatto che non capisco perch癡 non ti abbia funzionato il pezzo di codice
B4X:
Sub xclv_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
visto che ti trovi bene passando l'ID come Value della CLV.
Ti posto un piccolo esempio di quel pezzo di codice che non ti funziona, magari ti aiuta a capire cosa ti manca.
 

Attachments

  • CLV_Click.zip
    10.7 KB · Views: 45

Sagenut

Well-Known Member
Licensed User
Si, ma avevo solo inserito i codice che mi avevi dato
B4X:
Dim Pos1 As String = xclv.GetPanel(Index).GetView(3).Text
Dim Pos2 As String = xclv.GetPanel(Index).GetView(4).Text
Dim GEN As String = xclv.GetPanel(Index).GetView(5).Text
Domanda:
il tuo layout degli item della CLV contiene solo le 5 Label e niente altro?
 

3uowiS

Active Member
Licensed User
Domanda:
il tuo layout degli item della CLV contiene solo le 5 Label e niente altro?
Il layout contiene un panel che contiene le 5 label + 1 altro panel che uso da divisorio tra una riga e l'altra. Ho allegato uno screen.
Grazie ancora ragazzi per l'aiuto che mi date!!!
 

Attachments

  • Senza titolo-2.jpg
    Senza titolo-2.jpg
    118.2 KB · Views: 51

Sagenut

Well-Known Member
Licensed User
Non s簷 bene il tuo scopo e il loro utilizzo............. per簷 credo che i 2 Panel dal Layout li puoi rimuovere, se non hanno un ruolo specifico.
Il panel di base lo crei gi nella Sub dove popoli la CLV
B4X:
Dim p As B4XView = xui.CreatePanel("")
L altro panel sembra che tu lo voglia usare per avere una linea colorata per dividere gli Item.
Se guardi nelle propriet della CLV nel Designer vedrai che ci sono gi
Divider Color
Divider Height
che ti permettono di personalizzare una linea divisoria gi compresa nella CLV.
Ho indovinato? :)
Se invece vuoi mantenere i tuoi Panel perch癡 ti servono puoi accedere alle Label cos穫:
B4X:
dim s as String = xclv.GetPanel(index).GetView(0).Getview(0).text
Perch癡:
xclv.GetPanel(index) --- Prende il panel dell'Item dalla CLV
.GetView(0) --- Prende il tuo pnlplayer che 癡 la prima view ed 癡 il contenitore di tutte le altre cos穫 come lo hai usato
.GetView(0) --- Prende la prima Label contenuta nel tuo pnlplayer.
Essendo un contenitore extra ha di nuovo la sua lista di view che riparte da 0.
 
Last edited:

udg

Expert
Licensed User
Anche lasciando il layout inalterato pu簷 funzionare senza problemi. l'unica accortezza 癡 la lettura del primo panel da cui far dipendere le altre.
Es.
B4X:
dim p as panel = xclv.GetPanel(Index).GetView(0)
dim pnlPlayer as panel = p.getview(0)
dim Pos1 As String = pnlPlayer .getview(2).text
..
Risolto questo punto, io passerei ad utilizzare B4xView in modo da non essere confinato ad una specifica piattaforma.
Darei un'occhiata anche alle Anchors del layout (es. lblGen a dx, lblName su both, cos穫 come pnlPlayer)

ps: come Value potresti passare una map che contenga gi tutti i valori che ti interessano ed evitare di accedere di nuovo al DB oppure ai valori del panel della xCLV che potrebbero essere parziali (nel senso che sono solo quelli che mostri ma potresti avere altri campi cui sei interessato).

pps: sembra che il pranzo sia pronto..vado.. :)
 

Sagenut

Well-Known Member
Licensed User
Risolto questo punto, io passerei ad utilizzare B4xView in modo da non essere confinato ad una specifica piattaforma.
Assolutamente s穫
 

3uowiS

Active Member
Licensed User
Non s簷 bene il tuo scopo e il loro utilizzo............. per簷 credo che i 2 Panel dal Layout li puoi rimuovere, se non hanno un ruolo specifico.
Il panel di base lo crei gi nella Sub dove popoli la CLV
B4X:
Dim p As B4XView = xui.CreatePanel("")
Si, so che lo avevo gi creato con quella riga di codice ma non riuscivo a farlo adattare allo schermo, cos穫 ho creato quel panel in modo da farlo adattare a tutti gli schermi con lo script e poi l'ho usato come riferimento in questa riga
B4X:
p.SetLayoutAnimated(0,0,0,pnlPlayer.Width,pnlPlayer.Height)
probabilmente c'era un altro modo, meno contorto ma non sono riuscito a trovarlo...

L altro panel sembra che tu lo voglia usare per avere una linea colorata per dividere gli Item.
Se guardi nelle propriet della CLV nel Designer vedrai che ci sono gi
Divider Color
Divider Height
che ti permettono di personalizzare una linea divisoria gi compresa nella CLV.
Ho indovinato? :)
Esatto Non sapevo che esistesse anche quel metodo, grazie per l'informazione, come sempre preziosa! Ma quella linea l'ho fatta come gradiente che sfuma da nero a trasparente che 癡 pi羅 delicata e mi sembra che tramite quelle impostazioni non si possa.

Se invece vuoi mantenere i tuoi Panel perch癡 ti servono puoi accedere alle Label cos穫:
B4X:

dim s as String = xclv.GetPanel(index).GetView(0).Getview(0).text
Perch癡:
xclv.GetPanel(index) --- Prende il panel dell'Item dalla CLV
.GetView(0) --- Prende il tuo pnlplayer che 癡 la prima view ed 癡 il contenitore di tutte le altre cos穫 come lo hai usato
.GetView(0) --- Prende la prima Label contenuta nel tuo pnlplayer.
Essendo un contenitore extra ha di nuovo la sua lista di view che riparte da 0.
Grandissimo @Sagenut!!! Cos穫 ci sono riuscito a prendere tutti i dati che volevo!!! 戊戊戊
Grazie mille davvero!!!
 
Last edited:

3uowiS

Active Member
Licensed User
Risolto questo punto, io passerei ad utilizzare B4xView in modo da non essere confinato ad una specifica piattaforma.
Darei un'occhiata anche alle Anchors del layout (es. lblGen a dx, lblName su both, cos穫 come pnlPlayer)
Grazie @udg! Nella mia ignoranza credevo di averlo fatto... Non sto gi usando B4xView? Dove sbaglio?
E le Anchors non le ho usate perch矇 ho usato lo script. Pensavo fosse meglio...non va bene?

ps: come Value potresti passare una map che contenga gi tutti i valori che ti interessano ed evitare di accedere di nuovo al DB oppure ai valori del panel della xCLV che potrebbero essere parziali (nel senso che sono solo quelli che mostri ma potresti avere altri campi cui sei interessato).
Ecco, sicuramente sarebbe meglio, ma non ho idea di come si faccia una map... Dove posso trovare info su come fare?
 

Sagenut

Well-Known Member
Licensed User
Dove posso trovare info su come fare?
Trovi praticamente qualunque informazione, spesso con esempi, con la ricerca del forum che funziona decisamente bene. ;)
Ti 癡 stata fornita l'idea di cosa fare.............. ora come Esercizio prova a risolvere da solo. :)
Ma non buttare il codice che in questo momento hai e funziona, altrimenti rischi di bloccare lo sviluppo della tua app.
Poi c'癡 sempre tempo per fare domande se ci簷 che trovi non 癡 chiaro o non riesci a farlo funzionare.
Dato che l'argomento della domanda di questa discussione 癡 stato risolto dovrai aprire una nuova discussione con la nuova domanda, tipo:
Come ci crea e si usa una Map?
Ma prima cerca se trovi altre discussioni con la stessa domanda e relative risposte.
Ogni discussione deve/dovrebbe contenere solo una domanda specifica e le relative risposte, per non disperdere le informazioni e facilitare le ricerche successive.
E' il regolamento del forum.

P.S.= modifica il titolo della discussione aggiungendo all'inizio [B4A][RISOLTO] cos穫 chi cerca sapr che in questa discussione c'癡 una soluzione che funziona.
E nelle prossime domande, qu穫 sul forum Italiano, metti sempre il linguaggio che stai usando relativo alla domanda come [B4A] [B4J] [B4i].
 
Last edited:

udg

Expert
Licensed User
Dove posso trovare info su come fare?
La risposta pi羅 semplice 癡 quella di cercare sul forum (cerca "map" e vedrai le tonnellate di risposte..heheh)
La base 癡 che una map 癡 una specie di lista che contiene coppie chiave-valore (e le chiavi sono univoche)
Quindi qualcosa tipo
B4X:
dim m as map
m.initialize
m.put("key1", "valore1")
Nel tuo caso le chiavi potrebbero essere "gen", pos1", "pos2", ciascuna con il suo valore (che 癡 un object e quindi ci metti quello che ti pare)
Se ti occorre, aggiungi anche una chiave "id" e memorizzi l'ID univoco che hai sul DB per quel record da cui hai estratto quei valori

Come vedi 癡 uno strumento molto flessibile.
Una volta che ti sarai impratichito con le map, tenta quelle che io chiamo LOM (List of Maps); in pratica ogni elemento della List 癡 una Map. Un possibile utilizzo 癡 la memorizzazione di una serie di record ritornati da una query. Ogni record ha i suoi valori in una Map e la List rappresenta l'intero set di record della risposta.

Anchors-Script: guarda i video di Erel (sezione Learn). La risposta breve 癡 che le Anchors sono preferibili

B4xView: non 癡 automatico. Tocca a te scrivere dim l1 as B4xView invece che dim l1 as label. In pratica ricorri al tipo base (label) solo quando ti occorre qualche sua propriet o metodo non disponibile utilizzando la B4xView.

Edit: non solo @Sagenut mi ha anticipato, ma ha anche ricordato la regola d'oro: un thread (con titolo significativo) un argomento. Serve per facilitare la ricerca ad altri interessati al medesimo argomento.
 
Top