Italian Checkbox in una lista

toro1950

Active Member
Licensed User
Salve, ho una lista che visualizza i dati di un database, vorrei aggiungere un checkbox ad ogni linea della lista,
selezionando il checkbox vorrei eliminare dal database la linea selezionata tramite il relativo checkbox,
attualmente per farlo utilizzo un longclick sulla linea poi con un pulsante che si attiva elimino la linea,
ma facendolo testare sembra che non sia molto intuitivo, sicuramente con il checkbox lo sarebbe
Aggiungere il checkbox non è difficile, l'ho già fatto, ma come intercettare il checkbox selezionato ed abbinarlo alla linea
non ho idea, qualcuno di voi sicuramente saprà aiutarmi, con il longclick utilizzo quest codice che sicuramente qualcuno di voi mi avrà passato
B4X:
Dim p As B4XView = listamia.GetPanel(Index)
    Dim lblCampo1, lblCampo2, lblCampo3, lblCampo4 As Label 
    lblCampo1 = p.GetView(0)
    lblCampo2 = p.GetView(1)
    lblCampo3 = p.GetView(2)
    lblCampo4 = p.GetView(3)
poi utilizzando l'id riportato nel lblCampo4 elimino la linea dal database
 

LucaMs

Expert
Licensed User
Longtime User
B4X:
Private Sub DeleteChecked
    Dim pnlItem As B4XView
    Dim ID As Int
  
    Dim ItemIndex As Int = 0
    Do While ItemIndex < CustomListView1.Size
        pnlItem = CustomListView1.GetPanel(ItemIndex)
        chkItem = pnlItem.GetView(0) ' Supponendo che la CheckBox sia la prima View nell'Item, con indice zero.
        If chkItem.Checked Then
            ID = pnlItem.GetView(4).Text
            'Qui chiama l'esecuzione della sql che elimina il record.
            CustomListView1.RemoveAt(ItemIndex)
        Else
            ItemIndex = ItemIndex + 1
        End If
    Loop
End Sub
 
Last edited:

toro1950

Active Member
Licensed User
Buongiorno, LucaMs ti ringrazio per la tua disponibilta, purtroppo quel codice non va bene per me, io non devo cercare il checkbox attivato
ma devo intercettare l'attivazone della stesso, ho provato ma quando seleziono il checkbox la riga viene selezionata ma non sempre il checkbox si attiva,
cosi ho rinunciato ed ho trovato un altra soluzione che mi soddisfa, praticamente quando con un Longclik seleziono la riga questa cambia colore e mi attiva il pulsante elimina, cosi è abbastanza intuitivo, mi ha fatto penare spegnere la riga selezionata se ne seleziono un altra e spegnere quella selezionata se la riselzione, ma ci sono riuscito.
Grazie
 

Sagenut

Expert
Licensed User
Longtime User
Quindi tu vuoi eliminare solo un singolo elemento alla volta?
In questo caso non sarebbe meglio mettere, ad esempio, una icona con un cestino o una X rossa per poter eliminare direttamente i singoli elementi?
 

klaus

Expert
Licensed User
Longtime User
What kind of object holds your list and how do you fill it.
If you add a checkbox on each line, you might set the same event name for each checkbox and set its Tag property with the reference of the database item.
Then in the cbx_CheckedChange(Checked As Boolean) event routine you can use the Sender object to get the checkbox which raised the event.

Che tipo di oggetto contiene l'elenco e come lo si compila? Se si aggiunge una casella di controllo su ogni riga, è possibile impostare lo stesso nome evento per ogni casella di controllo e impostare la sua proprietà Tag con il riferimento all'elemento del database. Quindi, nella routine evento cbx_CheckedChange(Checked As Boolean) è possibile utilizzare l'oggetto Sender per ottenere la casella di controllo che ha generato l'evento. (Google translation)
 
Last edited:

PaulMeuris

Well-Known Member
Licensed User
In this tutorial you can find examples using a checkbox in a CLV: CLV examples
Page 5 with one selection and page 6 with multiple selections.
The checkbx1_CheckedChange() method (as mentioned by Klaus) is used to get the information of the item.
In that subroutine you can do the deletion of the item from the CLV (RemoveAt(index)) and/or the deletion in the database.
 

LucaMs

Expert
Licensed User
Longtime User
Buongiorno, LucaMs ti ringrazio per la tua disponibilta, purtroppo quel codice non va bene per me, io non devo cercare il checkbox attivato
ma devo intercettare l'attivazone della stesso, ho provato ma quando seleziono il checkbox la riga viene selezionata ma non sempre il checkbox si attiva,
cosi ho rinunciato ed ho trovato un altra soluzione che mi soddisfa, praticamente quando con un Longclik seleziono la riga questa cambia colore e mi attiva il pulsante elimina, cosi è abbastanza intuitivo, mi ha fatto penare spegnere la riga selezionata se ne seleziono un altra e spegnere quella selezionata se la riselzione, ma ci sono riuscito.
Grazie
Vediamo meglio. Vuoi solo che l'utente possa selezionare N CheckBox, una per ogni elemento della CLV? Oppure vuoi anche che questi elementi abbia un'aspetto diverso, ovvero "selezionato"?

Intanto ti indico una mia libreria per questa seconda opzione:
https://www.b4x.com/android/forum/threads/b4x-lm-xcustomlistview-1-73.106070/

Già che ci siamo, non sarebbe meglio se la chiave della tabella (l'ID, nel tuo caso) fosse memorizzata nel Tag dell'elemento della CLV?
 

LucaMs

Expert
Licensed User
Longtime User
Intanto ti indico una mia libreria per questa seconda opzione:
https://www.b4x.com/android/forum/threads/b4x-lm-xcustomlistview-1-73.106070/
Ci sarebbe anche questa (sempre mia):
https://www.b4x.com/android/forum/threads/b4x-clvitemtoolbox-custom-view.139304/#content

1.gif


Non sei obbligato a visualizzare tutte e tre Le opzioni che stanno sulla sinistra, puoi anche lasciare solo la CheckBox, senza penna o bidone:

2.gif
 
Last edited:

toro1950

Active Member
Licensed User
Grazie a voi tutti, ognuno di voi mi ha dato idee e proposte che apprezzo molto, in futuro ne approfitterò sicuramente, soprattutto della libreria di LucaMS che è molto elegante, ma ora vorrei fare una cosa più semplice possibile, l'idea i Sagenut mi sembra la più semplice ma non so se ho capito bene, se io aggiungo una X ad ogni riga, come rilevo che è stata selezionata? fino adesso io riesco a rilevare la riga selezionata ma non il singolo elemento della riga, se fosse possibile allora tutto sarebbe più facile
 

Sagenut

Expert
Licensed User
Longtime User
Oggi ho difficoltà ad andare al PC.
Sono sicuro che @LucaMs o altri ti faranno un piccolo esempio a breve.
Scusami.
 

Sagenut

Expert
Licensed User
Longtime User
In ogni item una icona di un bidone (o X rossa), cliccandola deve apparire un dialog per confermare l'eliminazione di quel item.
 

toro1950

Active Member
Licensed User
LucaMS ma funziona anche con BAI? se si allora...., come avevo scritto nel mio primo post la lista è composta
da quattro caselle ti testo che contengono alcuni valori che io prelevo ed utilizzo con la selezione della riga
B4X:
Private Sub listamia_ItemClick (Index As Int, Value As Object)
    Dim p As B4XView = listmia.GetPanel(Index)
    Dim lblCampo1, lblCampo2, lblCampo3, lblCampo4 As Label ' o B4XView, se vuoi
    lblCampo1 = p.GetView(0)
    lblCampo2 = p.GetView(1)
    lblCampo3 = p.GetView(2)
    lblCampo4 = p.GetView(3)
il valore di lblCampo4 contiene il valore ID del database che io utilizzo per rimuovere il record, ora vorrei sapere se esiste un modo
per intercettare quale label (campo del record) si è selezionata, con la sub riportata intercetto la riga (record) e con p.GetView leggo i dati
dei campi
 

LucaMs

Expert
Licensed User
Longtime User
LucaMS ma funziona anche con BAI?
Sì.

il valore di lblCampo4 contiene il valore ID del database che io utilizzo per rimuovere il record,
e quindi il codice che hai postato è già sufficiente, visto che scriveresti aggiungeresti:
B4X:
Dim ID As Int = lblCampo4.Text
' qui scriverai la query per eliminare il record dalla tabella (o chiamerai una Sub che lo faccia), in base al valore di ID.
'Qui elimini l'item della customlistView:
listamia.RemoveAt(Index)

ora vorrei sapere se esiste un modo
per intercettare quale label (campo del record) si è selezionata
label "selezionata"? Allora forse non devi usare l'evento listamia_ItemClick, ma l'evento delle label!
Esempio allegato, B4XPages, quindi funziona in B4J, B4A e B4I. Per B4I devi creare i layout (copia e incolla dal Designer B4A a quello B4I).
 

Attachments

  • ToroCLV.zip
    13.8 KB · Views: 28

LucaMs

Expert
Licensed User
Longtime User
NON HO B4I - mi pare che in B4I le Label non abbiano l'evento Click! (cercherò conferma).
E' più facile trovare... un pagliaio in un ago!
Se VI va, confermate o smentite, ma per il sottoscritto ha comunque scarsissima importanza, dato che non ho B4I.


Nota: sarà pure parecchio difficile trovare un ago in un pagliaio, ma è impossibile il contrario 😁
 

toro1950

Active Member
Licensed User
In B4I sulle label si può utilizzare l'evento Click, LucaMs ho provato il file ToroCLV ma non funziona come speravo,
la sub IItemLabel_Click mi restituisce sempre Nome, Cognome e Professione come la mia ItemClick, io speravo che mi restitusse
solo quello riportato dove effettuo il tap, cosi non mi è utile
 

Sagenut

Expert
Licensed User
Longtime User
Devi creare l'evento Click delle varie Label dal Designer.
Intendo gli eventi delle label del layout del tuo item che utilizzi per popolare la CLV.
Poi gli eventi dovranno essere così
B4X:
Private Sub Label1_Click
   Dim MyLabel as B4XView = Sender
   Log(MyLabel.Text)
End Sub
Ovviamente avrai i vari nomi delle tue label come eventi Click.
Attenzione che stiamo andando fuori dall'argomento iniziale del titolo della discussione.
 

toro1950

Active Member
Licensed User
Sagenut io vorrei fare come mi hai consigliato tu, aggiungere una label con una X rossa alle quattro presente nella riga e rilevare quando questa riceve un tap.
Se aggiungo un'altra label al designer questa si chiamerà label5. Quindi l'evento Click devo crearlo su questa Label5_Click, però nella mainpage dove
si trova la lista potrebbe esserci qualche label chiamata Label5, in questo dovrei cambiare nome alla Label con la X giusto? Ora se rilevo il tap, quindi la richiesta di
cancellazione come ricavo l'index della lista affinchè possa leggermi il valore della quarta tabella che contiene l'ID del record. Con Item_Click ricavo
immediatamente l'index della lista. Scusatemi ma sono molto ignorante su questa cosa, avrei bisogno di un esempio
 
Top