Italian Inserire un elemento in uno spinner ad una determinata posizione salvandolo in sqlite database

fifiddu70

Well-Known Member
Licensed User
Ciao a tutti come da post scritto in inglese, ho bisogno di trovare una soluzione al mio problema, praticamente ho un databse in sqlite dove attraverso due caselle di testo inserisco in una la descrizione ad esempio la pizza margherita, nell'altra invece il prezzo, per poi memorizzarlo in uno spinner e attraverso il databse con il seguente codice:
B4X:
Sub btnm1_Click
 
   dbSQL.ExecNonQuery2("INSERT INTO field1 VALUES (?)", Array As String(txtmenu.Text & " - " & "Euro" & " " & txtcaricoeuro.Text))
            spm1.Add (txtmenu.Text & " " & "Euro" & " " & txtcaricoeuro.Text)
            txtcaricoeuro.Text="" ' pulisco la casella di testo txtcaricoeuro.text
            dbCursor.Close
         

            Msgbox("item added","stored")
            txtmenu.Text=""
 
 
    phone1.HideKeyboard(Activity)
    txtcaricoeuro.Text=0
End Sub
mentre per eliminare il prodotto appena inserito uso il seguente codice:
B4X:
Sub btnm1_LongClick
dbSQL.ExecNonQuery2("DELETE FROM field1 WHERE data1 = ?", Array As String(spm1.SelectedItem))
        Msgbox ("elemento rimosso dallo spinner ","NOTE")
      
end sub
il mio problema e che se ad esempio inserisco un elemento e lo salvo nel database questi va ad aggiungersi alla fine dello spinner per poi seguire gli altri, ma se ad esempio mi accorgo che al terzo elemento inserito nello spinner ho sbagliato qualcosa e se voglio eliminarlo, fin qui nessun problema ma poi per aggiungerlo alla stessa posizione dopo averlo riscritto correttamente questi si va ad aggiungere all'ultima posizione dello spinner, come faccio ad inserirlo dinuovo dove era prima cioè nella terza posizione evitando che vada alla fine?
 

Sagenut

Well-Known Member
Licensed User
Ti butto lì una idea forse non troppo professionale, in attesa che qualcuno più esperto possa aiutarti in maniera più concreta. :p
Se la lista delle cose non è enorme, all'avvio della app puoi leggere la tabella dal database e inserirla in una List.
Poi popoli lo Spinner leggendo la List.
Ogni volta che farai una modifica dovrai modificare i dati sia sul DB che localmente sulla List, con il comando List.Set, svuotare lo Spinner e ripopolarlo di nuovo rileggendo dalla List.
In pratica il DB lo dovrai leggere solo all'avvio dell'app e poi lo dovrai tenere comunque aggiornato per averlo sempre attuale al prossimo avvio della app.
Probabilmente però la soluzione migliore sarebbe trovare uno Spinner Custom che fornisca già i comandi per modificare un elemento alla posizione desiderata.
 
Last edited:

LucaMs

Expert
Licensed User
Magari dopo leggerò più attentamente il post di fifiddu, ma "a naso" dovresti subito evitare di mischiare due cose diverse, ovvero il reperimento di dati (da db, in questo caso) e la visualizzazione dei dati (spinner).

Anche la notte scorsa non ho proprio letto attentamente la domanda nel forum "internazionale" ma mi pare d'aver capito che vorresti poter "gestire" un elemento dello spinner, ovvero poterne modificare il contenuto (che poi è semplice testo). La faccio così breve perché non dipende da dove arrivino i dati, se da db, da elaborazioni del sw, da fonti esterne, da remoto, etc.

Il punto è che lo spinner non ha alcun metodo per poter fare modifiche ad uno solo suoi elementi, per cui devi cambiare view per la visualizzazione, altrimenti ad ogni modifica dati dovrai ricaricare lo spinner da zero, completamente, ed è per questo che in quel thread ti ho consigliato di usare una xCustomListView invece di uno spinner.
 

LucaMs

Expert
Licensed User
upload_2019-10-23_12-2-51.png


In questo modo vedrai elencati tutti i membri disponibili in uno Spinner (vale ovviamente per tutte le view e tutti gli oggetti), in particolare dovresti guardare i metodi (le routine), indicati dai cubetti.

Il metodo Add ti consente di aggiungere un elemento ad uno Spinner, ma verrà accodato, non potrai inserirlo in una specifica posizione, mentre con xCLV avrai il metodo InsertAt che invece ti consentirà di farlo.

Scorrendo la lista, altri metodi utili ma non sufficienti per ciò che ti serve sono RemoveAt, che ti consentirebbe di togliere dallo Spinner l'item da modificare, che abbia un valore sbagliato, ma appunto se poi vuoi inserirlo col testo corretto non hai un metodo InsertAt.
 

fifiddu70

Well-Known Member
Licensed User
non ho mai utilizzato una xclv spero sia compatibile al lavoro ormai fatto da tempo, dove ci sono 9 spinner pieni di codice, la xcustom listviev ha le stesse funzioni di uno spinner con qualche marcia in più oppure non funziona come lo spinner?
 

LucaMs

Expert
Licensed User
dove ci sono 9 spinner pieni di codice
Fammi un esempio, perché gli spinner in sé non sono mai "pieni di codice"; avrai delle routine che caricano quegli Spinner e la cosa da cambiare sarà appunto di caricare i dati in una xCustomListView anziché in uno Spinner.

Lo Spinner è un po' come una ComboBox, mentre la xCustomListView è come la ListView ma molto più flessibile, più utile.

Questo significa che per "simulare" uno Spinner usando la xCustomListView, magari userai una label che mostrerà il valore selezionato, clickando sulla label farai apparire un panel trasparente sul quale avrai messo una xCustomListView nella quale caricherai i dati.

Devo cercare ma magari esiste già una simile "versione" della xCustomListView già bell'e pronta. Ti faccio sapere; è comunque molto facile da fare, come ho appena spiegato.
 

LucaMs

Expert
Licensed User
Devo ancora provare ma questa:
https://www.b4x.com/android/forum/t...ss-platform-views-and-dialogs.100836/#content
a giudicare dalle descrizioni:
- B4XComboBox - Cross platform ComboBox / Spinner / ActionSheet.
sembra indicare che andrebbe bene.

Faccio una provola :D veloce e ti dico...
No, non va bene, anche la B4XComboBox non consente la gestione di un determinato singolo item.

Resta valido il consiglio del post precedente. Magari ti faccio un progettINO d'esempio e lo allego!
 
Top