Italian [Risolto by LucaMs]XCLV Rimuovere item ma....anche da un'altra lista

XorAndOr

Active Member
Licensed User
Longtime User
Ciao
Gentilmente potrei avere un aiutino?
Tempo fa avevo postato una domanda per controllare
i doppioni di item da una xclv ad un'altra
la soluzione me l'avete data voi (e vi ringrazio) nell'usare una list per verificare doppioni
esempio...If lista.IndexOf(VarNome) = -1 Then......

Ora vorrei utizzare questa List nel mio progetto
quindi ho messo un button Rimuovi nella xclv
che rimuove l'item dalla xclv e fin qui funziona.

Il problema ora è come rimuovo l'item che ho aggiunto anche alla List?
perchè non ha lo stesso Index.
Allego esempio che è meglio delle parole!
p.s. nellesempio c'è una textarea ma è solo come visualizzatore
Grazie
 

Attachments

  • TestXclv.zip
    5.1 KB · Views: 70

Xfood

Expert
Licensed User
ciao,
credo piu o meno nello stesso esempio che ti hanno dato prima

f lista.IndexOf(VarNome) = -1 Then......
B4X:
dim indice as int =lista.IndexOf(VarNome)
if indice >-1 then
lista.RemoveAt(indice)
end if
non testato, scritto al volo
 

LucaMs

Expert
Licensed User
Longtime User
ciao,
credo piu o meno nello stesso esempio che ti hanno dato prima

f lista.IndexOf(VarNome) = -1 Then......
B4X:
dim indice as int =lista.IndexOf(VarNome)
if indice >-1 then
lista.RemoveAt(indice)
end if
non testato, scritto al volo
Andrebbe bene, se mantenesse allineati clv e list, ma visualizza N item nella clv ed aggiunge alla lista solo quelli che vengono clickati, quindi non può usare l'indice.
 

Xfood

Expert
Licensed User
scusa @LucaMs non posso provare in questo momento,
ma in realta pensavo che se fa una ricerca su list,
dim indice as int =lista.IndexOf(VarNome) ' varNome= alla descrizione dell'item della xclv che ha rimosso precedentemente
si trova l'indice della list, e quindi poi potrebbe cancellare l'item della list


ma forse mi sbaglio......
 

LucaMs

Expert
Licensed User
Longtime User
scusa @LucaMs non posso provare in questo momento,
ma in realta pensavo che se fa una ricerca su list,
dim indice as int =lista.IndexOf(VarNome) ' varNome= alla descrizione dell'item della xclv che ha rimosso precedentemente
si trova l'indice della list, e quindi poi potrebbe cancellare l'item della list


ma forse mi sbaglio......
No, non sbagli, ed infatti così ho fatto (lui non associava un valore agli item, gli ho fatto aggiungere il nome).

Quello che non era possibile era il tuo codice nel tuo post precedente, perché visto il modo in cui aggiunge gli elementi alla clv, questa poteva avere 10 item ma la list 3 e quindi non poteva usare l'index che otteneva premendo un tasto facente parte l'item.
 

XorAndOr

Active Member
Licensed User
Longtime User
ciao,
credo piu o meno nello stesso esempio che ti hanno dato prima

f lista.IndexOf(VarNome) = -1 Then......
B4X:
dim indice as int =lista.IndexOf(VarNome)
if indice >-1 then
lista.RemoveAt(indice)
end if
non testato, scritto al volo
Grazie @Xfood ho provato e mi rimuoveva solo l'ultimo item
testato con un ciclo for
B4X:
Dim indice2 As Int = lista.IndexOf(VarNome)
    
    If indice2 > -1 Then
        
        lista.RemoveAt(indice2)

    End If
    
    
    For i = 0 To lista.Size -1
        
        Log(lista.Get(i))

    Next
 

Xfood

Expert
Licensed User
Grazie @Xfood ho provato e mi rimuoveva solo l'ultimo item
testato con un ciclo for
B4X:
Dim indice2 As Int = lista.IndexOf(VarNome)
   
    If indice2 > -1 Then
       
        lista.RemoveAt(indice2)

    End If
   
   
    For i = 0 To lista.Size -1
       
        Log(lista.Get(i))

    Next
ok, grazie, appena posso faccio qualche prova, di piu per studio che per altro
 

Xfood

Expert
Licensed User
Eccomi,
premetto che non ho guardato ancora il codice del grande @LucaMs per evitare di "contaminare la mia idea"
la richiesta era,

Rimuovere item ma....anche da un'altra lista​


ho aperto il codice originale, BTEscludi_Click
popolato la variabile VarNome

e quindi mi trovo l'indice della lista, cercando il nome,
se l'indice e' maggiore di -1 rimuovo l'item della lista,


semmai il problema e che la visualizzazione non e' la lista, ma una text area, e in quel caso bisogna anche ricreare la text area, se guardi il log si vede che funziona.
1680976376779.png

rimuovo Maikol che nella lista e' alla posizione 3
e se scorro la lista ecco cosa vedo
1680976437430.png

era solo per capire niente di piu...



B4X:
'Rimuove l'item dalla XCLV1
Private Sub BTEscludi_Click
    Dim index As Int = XCLV1.GetItemFromView(Sender)
  [B] VarNome = XCLV1.GetPanel(index).GetView(0).Getview(0).text[/B]
    XCLV1.RemoveAt(index)
    Log(index)
    Log(VarNome)
'Qui mi servirebbe che rimuovesse anche l'item dalla Lista (List)
   
 [B]  Dim index2 As Int=lista.IndexOf(VarNome)
    Log(index2)
   if index2>-1 then     lista.RemoveAt(index2)[/B]
    Log("inizio verifica Lista")
    For i = 0 To lista.Size -1
       
        Log(lista.Get(i))

    Next
    Log("Fine verifica Lista")
End Sub

se poi voglio aggiornare anche la textarea aggiungo il codice, modifico da log("inizio Verifica Lista")
B4X:
Log("inizio verifica Lista")
    TextArea1.Text = ""
    For i = 0 To lista.Size -1
        TextArea1.Text = TextArea1.Text & lista.Get(i) & CRLF
        Log(lista.Get(i))

    Next
    Log("Fine verifica Lista")

p.s. adesso guardo il codice di @LucaMs , sicuramente sara' scritto molto meglio del mio, ma non volevo farmi condizionare la mia idea
 
Last edited:

Xfood

Expert
Licensed User
Grazie @Xfood ho provato e mi rimuoveva solo l'ultimo item
testato con un ciclo for
B4X:
Dim indice2 As Int = lista.IndexOf(VarNome)
   
    If indice2 > -1 Then
       
        lista.RemoveAt(indice2)

    End If
   
   
    For i = 0 To lista.Size -1
       
        Log(lista.Get(i))

    Next
l'errore e' stato che la variabile VarNome devi ripopolarla dentro il pulsante BTEscludi_Click
VarNome = XCLV1.GetPanel(index).GetView(0).Getview(0).text
 

Xfood

Expert
Licensed User
guardando meglio il codice di @LucaMs ti consiglio anche di modificare il codice su
Button1_Click

diventa piu pulito, e se cambi disposizione dei pannelli hai sempre il valore che ti serve per popolare la textarea


B4X:
'Aggiunge Nomi alla Lista
Private Sub Button1_Click   
    Dim index As Int = XCLV1.GetItemFromView(Sender)       
'    VarNome = XCLV1.GetPanel(index).GetView(0).Getview(0).text
    VarNome = XCLV1.GetValue(index)'LM
        
    'Controllo doppioni
    If lista.IndexOf(VarNome) = -1 Then
        TextArea1.Text = TextArea1.Text & VarNome & CRLF
        lista.Add(VarNome)
    Else       
        xui.MsgboxAsync(VarNome & " è già presente", "Attenzione")
    End If
 

XorAndOr

Active Member
Licensed User
Longtime User
Buona Pasqua a tutti

Domanda un pò fuori topic ma solo per capire (imparare) per @LucaMs
stavo guardando il codice di ieri e noto che hai scritto in modo diverso
una routine per prelevare un determinato valore dal panel
B4X:
Dim index As Int = XCLV1.GetItemFromView(Sender)
VarNome = XCLV1.GetPanel(index).GetView(0).Getview(0).text'Mio
Log("Mio " & VarNome)


Dim index As Int = XCLV1.GetItemFromView(Sender)
Dim VarNome As String = XCLV1.GetValue(index)'LucaMs
Log("LucaMs " & VarNome)

praticamente fanno la stessa cosa. Volevo capire in quali casi và usato uno o l'altro.
grazie
 

LucaMs

Expert
Licensed User
Longtime User
Buona Pasqua a tutti

Domanda un pò fuori topic ma solo per capire (imparare) per @LucaMs
stavo guardando il codice di ieri e noto che hai scritto in modo diverso
una routine per prelevare un determinato valore dal panel
B4X:
Dim index As Int = XCLV1.GetItemFromView(Sender)
VarNome = XCLV1.GetPanel(index).GetView(0).Getview(0).text'Mio
Log("Mio " & VarNome)


Dim index As Int = XCLV1.GetItemFromView(Sender)
Dim VarNome As String = XCLV1.GetValue(index)'LucaMs
Log("LucaMs " & VarNome)

praticamente fanno la stessa cosa. Volevo capire in quali casi và usato uno o l'altro.
grazie
Tu hai preso il testo di una Label che fa parte dell'item, nel quale potresti avere più Label ed altre View.
Io ho preso il valore che si può, e spesso fa comodo, associare all'item (valore che può essere di qualsiasi tipo; secondo me la cosa migliore è un custom type).
 
Last edited:

LucaMs

Expert
Licensed User
Longtime User
Ho guardato di nuovo quel sorgente. Ho commesso un "errore" (diciamo una imprecisione).

B4X:
    Dim IndexFound As Int = lista.IndexOf(VarNome)'LM
    If IndexFound <> - 1 Then 'LM
'        lista.RemoveAt(lista.IndexOf(VarNome)) 'LM  Questa riga... meglio quella sotto.
        lista.RemoveAt(IndexFound) 'LM
        AggiornaTextArea'LM
    End If'LM

All'inizio non avevo scritto quella variabile IndexFound ed avevo già la riga successiva.
Quando poi ho creato quella variabile, non l'ho usata "al meglio", ovvero per la rimozione del dato dalla lista.

E' ovvio che funzionasse ugualmente ma così è più "formalmente corretto" (ed anche più veloce, benché la lista fosse corta, perché così non viene eseguita due volte la ricerca nella lista, con IndexOf)
 

LucaMs

Expert
Licensed User
Longtime User
Già che ci sono, inizio a scrivere qui una mezza idea che si potrebbe utilizzare, forse (mal di testa maledetto permettendo).

Faccio un esempio che probabilmente è una delle cose che si fa più frequentemente con le CLV nelle app mobile: mostrare il contenuto di una (o più) tabelle di DB.
Un elenco di articoli in vendita, magari anche solo un elenco di pietanze in un ristorante.

Come "sempre", si dovrebbe cercare di mantenere separati grafica e logica-dati. Questo perché magari in futuro potresti modificare la grafica ma non il resto oppure usare logica-dati per mostrare l'elenco su una pagina web di un tuo sito anziché su uno smatphone.

Un modo utile potrebbe essere: associare ad ogni item (continuiamo a chiamarli così o "elementi", all'italiana? Meglio item, forse) la chiave primaria (solitamente l'ID) della tabella.

[Questo è un esempio anche della differenza tra il modo che ha usato @XorAndOr per leggere quel dato, da una Label, anziché prendere il valore associato all'item; in questo caso le due cose corrispondevano]

Beh, smetto di "ragionare" (si fa per dire 😁) e provo a fare un disegnino al volo (che, in quanto tale, so già sarà orripilante 😄), che allegherò al post successivo.
 
Top