Italian problema con clv di b4a

marketto

Member
Licensed User
E' la prima volta che entro in questo forum.. e approfitto per salutare tutti.
Il mio problema è questo.
Mi sono creato una Custom List View composta da un checkBox e una label.
Fino qui tutto bene.
Poi mi sono creato il layout dove sono contenuti e in tale layout ho nominato la label.
Nel layout principale ha creato la CustonListView che contiene i vari item
Ho poi creato il codice per visualizzare il checkbox e la label.
Ancora bene. Viene tutto visualizzato bene.
Il checbox ok.
Naturalmente la lable ha il valore che ho impostato nel layout.
Ora mi chiedo come fare per scrivere in valore di una varibile stringa qualsiasi, all'inteno della mia lable che appartiene a Custom List View.

Grazie Marco

codice progetto lista spesa:
Sub creaClv
    
    Dim xui As XUI
        
    'conreollo se il file di testo esiste
    If File.Exists(File.DirInternal, "family/spesa.txt") Then 'se il file esiste
        
        'carico i dati su list1 dal file spesa.txt
        list1 = File.ReadList(File.DirInternal, "family/spesa.txt")
                
        For i = 0 To 99
            
            'metti i valori del file spesa txt sulla variabile lista Spesa
            listaSpesa(i) = list1.Get(i)
            
            'definizione variabili
            Dim p As B4XView = xui.CreatePanel("")
            
            If listaSpesa(i) <> "" Then
                'itemSpesaLabel.Text = "0"
                'Log("passo")
                
                p.SetLayoutAnimated(100,0,0,100%x,40dip)
            
                p.LoadLayout("itemspesa")
                spesaCustomListView.Add(p,"")
                        
            End If
        Next
    Else 'il file spesa.txt non esiste
        
    End If   
End Sub
 

Sagenut

Well-Known Member
Licensed User
La Label credo che sia nel Layout "itemspesa".
Devi creare il riferimento di quella Label da Designer (click destro sulla Label, Generate member, Dim as B4XView), se non lo hai già fatto.
Subito dopo aver caricato il Layout "itemspesa" puoi assegnare il valore alla Label prima di fare ADD sulla Customlistview.
B4X:
miaLabel.Text = Listaspesa(i)
Non sono davanti al PC quindi per il momento vedi se riesci a cavarsela solo con questa spiegazione. :)
 
Last edited:

Sagenut

Well-Known Member
Licensed User
Prova così:
B4X:
Private miaLabel as B4XView 'Questa riga verrà creata dal Designer con il Generate Member
                          'Ovviamente avrà il nome della tua Label

Sub creaClv
    Dim xui As XUI
      
    'controllo se il file di testo esiste
    If File.Exists(File.DirInternal, "family/spesa.txt") Then 'se il file esiste
      
        'carico i dati su list1 dal file spesa.txt
        list1 = File.ReadList(File.DirInternal, "family/spesa.txt")         

        For i = 0 To (list1.size - 1) 'Crea un ciclo dipendente da quanti elementi contiene la lista
            Dim p As B4XView = xui.CreatePanel("") 'Crea il pannello
            p.SetLayoutAnimated(100,0,0,100%x,40dip)
            p.LoadLayout("itemspesa")
            miaLabel.Text = list1.Get(i) 'Assegna alla Label il valore dell'elemento corrente nella Lista
            spesaCustomListView.Add(p,"")
        Next
    Else 'il file spesa.txt non esiste
      
    End If 
End Sub
Il ciclo For in questo modo è determinato dalla lunghezza della lista e non sei limitato/forzato ad una lunghezza fissa di 100 elementi (sempre che non fosse voluto per qualche motivo).
Alla Label viene assegnato ciò che è contenuto nell'indice corrente della Lista, usando direttamente la List senza copiarla in un altro Array che è una cosa inutile (sempre che non sia determinato da altri motivi).
 
Last edited:

marketto

Member
Licensed User
Grazie dell’aiuto.
Ho provato e funziona bene.
Nella mia lista dentro clv ho anche un checkbox che dovrò selezionare fatta la spesa.
Praticamente il prodotto della spesa che acquisto lo spunto e lui graficamente mi cambia stato.
Ora mi chiedo come fare per capire da codice quale ho pigiato (selezionato) in modo da poterlo poi salvare sul file spesa.txt
 

Sagenut

Well-Known Member
Licensed User
Dal Designer crea l'evento CheckedChange della Checkbox (click destro, Generate, CheckedChange)
Nell'IDE troverai la Sub dell'evento, aggiungi questo codice:
B4X:
Sub CheckBox1_CheckedChange(Checked As Boolean)            'Questa Sub la crea il Designer
    Dim cb As CheckBox = Sender                            'Crea una Checkbox che fà riferimento a quella cliccata
    dim quale as int = spesaCustomListview.GetItemFromView(cb) 'Ottiene il numero dell'Item che contiene la Checkbox cliccata
End Sub
 
Last edited:

LucaMs

Expert
Licensed User
dim quale as int = CustomListView1.GetItemFromView(cb)
Come indica il commento, quellla riga ottiene l'indice dell'item (elemento); da questo devi ottenere il pannello base che contiene le view caricate col layout.
Nell'esempio di Erel:
B4X:
Sub CheckBox1_CheckedChange(Checked As Boolean)
    Dim index As Int = clv2.GetItemFromView(Sender)
    Dim pnl As B4XView = clv2.GetPanel(index)
    Dim chk As B4XView = pnl.GetView(2)
    MsgboxAsync($"Item value: ${clv2.GetValue(index)}
Check value: ${chk.Checked}"$, "")
End Sub
In cui clv2 è un xCustomListView e in ogni pannello/item la checkbox chk è la terza view (pnl.GetView(2)).
 

marketto

Member
Licensed User
Intanto ancora grazie... ho provato ad utilizzare il codice di Sagenut e tutto ha funzionato. Mi ha restituito il quale giusto che ho poi utilizzato. Adesso non ho modo di postare il codice...
Ora però ho notato che da un altra sub che va a leggere le checkbox e a riscriverle, sulla clv mi parte la sub _checkedChange. Ad esempio se scrivo checkbox.che chef = true mi fa partire la sub come se avessi cliccato fisicamente sullo schermo dello smartphone.
Deve fare così. Bo.
 

Sagenut

Well-Known Member
Licensed User
Non mi pare di avere questo problema.
Quando puoi posta la parte di codice che genera il problema oppure (ancora meglio) allega tutto il tuo progetto se possibile.
Puoi allegare il progetto cliccando su questa icona
export.jpg

o scegliendo EXPORT AS ZIP dal menù File.
Per postare il codice usa
post code.jpg

e incolla il codice che vuoi mostrare nella finestra che si aprirà.
 

marketto

Member
Licensed User
Mi da errore nella linea 7 quando
su un altra sub
richiamo la seguente linea di comando: spesaCheckBox.Checked = True
appena richiamo tale linea si attiva la sub che allego nel codice
B4X:
Sub spesaCheckBox_CheckedChange(Checked As Boolean)
    'If cliccato = 1 Then
        'Log(" ")
        Msgbox("----- CHECKED CHANGE -----","")
    
        Dim cb As CheckBox = Sender 'Crea una Checkbox che fà riferimento a quella cliccata
        Dim quale As Int = spesaCLV.GetItemFromView(cb) 'Ottiene il numero dell'Item che contiene la Checkbox cliccata
    
        'conrollo se il file di testo esiste
        If File.Exists(File.DirInternal, "family/spesa.txt") Then 'se il file esiste
            Dim xui As XUI
        
            'carico i dati su list1 dal file spesa.txt
            list1 = File.ReadList(File.DirInternal, "family/spesa.txt")
        
            'carico i dati su list1 dal file spesa.txt
            'Log("Lista Spesa: " &
            'Log("#############")
            'Log("Quale: " & quale)
            For i = 0 To 99
                listaSpesa(i) = list1.Get(i)
            
                If listaSpesa(i) <> "" Then
                    'metti i valori del file spesa txt sulla variabile listaSpesa se diversi da ""
                    'Log("lista spesa: " & listaSpesa(i))
                
                    Dim stringArray() As String = Regex.Split("\|",listaSpesa(i))
                    'Log("stringArray(1): " & stringArray(1))
                    'Log("Quale: " & quale & "   i: " & i)
                    If i = quale Then
                        'Log("i = quale: " & i)
                        If stringArray(1) = "False" Then
                            'Log("ci passo")
                            stringArray(1) = "True"
                        Else
                            stringArray(1) = "False"
                        End If
                    
                    End If
                
                    'If i = quale And stringArray(1) = True Then
                    'stringArray(1) = True
                    'End If
                    listaSpesa(i) = stringArray(0) & "|" & stringArray(1)
                
                    'Log("listaSpesa: " & listaSpesa(i))
                
                End If
            
            Next
            File.WriteList(File.DirInternal, "family/spesa.txt", listaSpesa)
        End If
    'End If

End Sub
 

marketto

Member
Licensed User
Mi da errore nella linea 7 quando su un altra sub richiamo la seguente linea di comando: spesaCheckBox.Checked = True
Appena richiamo tale linea mi entra nella sub che allego nel codice sotto
B4X:
Sub spesaCheckBox_CheckedChange(Checked As Boolean)
    'If cliccato = 1 Then
        'Log(" ")
        Msgbox("----- CHECK
  
        Dim cb As CheckBox = Sender 'Crea una Checkbox che fà riferimento a quella cliccata
        Dim quale As Int = spesaCLV.GetItemFromView(cb) 'Ottiene il numero dell'Item che contiene la Checkbox cliccata
  
        'conrollo se il file di testo esiste
        If File.Exists(File.DirInternal, "family/spesa.txt") Then 'se il file esiste
            Dim xui As XUI
      
            'carico i dati su list1 dal file spesa.txt
            list1 = File.ReadList(File.DirInternal, "family/spesa.txt")
      
            'carico i dati su list1 dal file spesa.txt
            'Log("Lista Spesa: " &
            'Log("#############")
            'Log("Quale: " & quale)
            For i = 0 To 99
                listaSpesa(i) = list1.Get(i)
          
                If listaSpesa(i) <> "" Then
                    'metti i valori del file spesa txt sulla variabile listaSpesa se diversi da ""
                    'Log("lista spesa: " & listaSpesa(i))
              
                    Dim stringArray() As String = Regex.Split("\|",listaSpesa(i))
                    'Log("stringArray(1): " & stringArray(1))
                    'Log("Quale: " & quale & "   i: " & i)
                    If i = quale Then
                        'Log("i = quale: " & i)
                        If stringArray(1) = "False" Then
                            'Log("ci passo")
                            stringArray(1) = "True"
                        Else
                            stringArray(1) = "False"
                        End If
                  
                    End If
              
                    'If i = quale And stringArray(1) = True Then
                    'stringArray(1) = True
                    'End If
                    listaSpesa(i) = stringArray(0) & "|" & stringArray(1)
              
                    'Log("listaSpesa: " & listaSpesa(i))
              
                End If
          
            Next
            File.WriteList(File.DirInternal, "family/spesa.txt", listaSpesa)
        End If
    'End If

End Sub
 

Sagenut

Well-Known Member
Licensed User
Devi postare anche il contenuto dell'errore dal LOG, ovvero tutta la parte in rosso.
Usa la funzione QUOTE per fare questo
quote.jpg

E possibilmente allega l'intero progetto con la funzione EXPORT AS ZIP (o l'icona del pacco regalo) altrimenti è davvero difficile (direi impossibile) capire il flusso del programma.
Così al volo mi viene da pensare che la SUB che ti crea il problema sia quella che deve caricare la lista all'inizio.
L'errore potrebbe essere che tu dai un valore a spesaCheckbox, che quindi correttamente scatena l'evento CheckedChanged, ma non provenendo da un click specifico su una Checkbox il Sender non riesce a identificarlo correttamente.
O forse quando assegni il valore a spesaCheckbox ancora non è stata popolata la spesaCLV quindi non può trovare l'item perchè ancora non esiste.
Ma senza vedere il tuo progetto sono solo supposizioni.
 

LucaMs

Expert
Licensed User
Intanto ancora grazie... ho provato ad utilizzare il codice di Sagenut e tutto ha funzionato. Mi ha restituito il quale giusto che ho poi utilizzato. Adesso non ho modo di postare il codice...
Ora però ho notato che da un altra sub che va a leggere le checkbox e a riscriverle, sulla clv mi parte la sub _checkedChange. Ad esempio se scrivo checkbox.che chef = true mi fa partire la sub come se avessi cliccato fisicamente sullo schermo dello smartphone.
Deve fare così. Bo.
Sì, è ovvio che venga avviata la routine-evento spesaCheckBox_CheckedChange se tu vai a cambiare il valore di una ChekBox direttamente da codice, senza il click dell'utente.

Per evitarlo avevi messo una variabile ed era la giusta idea; dichiara una variabile boolean privata a livello globale (stai usando le B4XPages o no? Se sì, nella Class_Globals, altrimenti nella Process_Globals), ad esempio chiamala CambioManuale (da non confondere con quello dell'automobile 😁 ) e come prima riga:
B4X:
Sub spesaCheckBox_CheckedChange(Checked As Boolean)
    If CambioManuale Then Return

Ovviamente nella routine in cui fai i cambi "manualmente" (senza click):
B4X:
Sub QuellaRoutine
    CambioManuale = True
    ' Qui esegui i cambi.
    ' Prima di uscire dalla routine...
    CambioManuale = False
End Sub
 
Last edited:

LucaMs

Expert
Licensed User
E possibilmente allega l'intero progetto con la funzione EXPORT AS ZIP (o l'icona del pacco regalo) altrimenti è davvero difficile (direi impossibile) capire il flusso del programma.
Se sviluppate progetti B4XPages (cosa consigliatissima) non usate quel metodo per esportare il progetto (cosa che purtroppo ancora tanti fanno). Usate:

1607973534505.png


ovvero fate click col mouse mentre premete CTRL sulla tastiera. Consigliato cambiare la parte finale di quel link, ovvero il nome del progetto Project.zip con il nome del vostro progetto (altrimenti su b4x.com troveremo sempre progetti allegati con lo stesso nome generico Project).
 

Sagenut

Well-Known Member
Licensed User
Siamo ancora legati alle vecchie abitudini. 😅
E bisogna vedere cosa stà utilizzando @marketto
 

Sagenut

Well-Known Member
Licensed User
Mi permetto di suggerire a @marketto di fare un donazione per lo sviluppo di B4X:
https://www.b4x.com/b4a.html
In questo modo diventerai Licensed User e i tuoi messaggi appariranno subito senza dover attendere l'approvazione della Direzione. 😁
Altrimenti ci mettiamo un mese per scrivere 2 cose. ;)
 

Sagenut

Well-Known Member
Licensed User
Top