Italian Salvare listview

tonyx67

Member
Salve a tutti sto provando in tutti i modi ma non riesco a far si che gli elementi in una listview vengono memorizzati in modo che uscendo e rientrando dall'app.li trovo li.
ho provato con il seguente codice ma niente.Help:(
Dim salva As TextWriter

Sub Activity_Create(FirstTime As Boolean)

salva.Initialize(File.OpenOutput(File.DirRootExternal,"Risultati.txt",False))

End Sub

Sub Button2nuovo_Click

salva.WriteLine(ListView2risultati.GetItem & CRLF )
salva.WriteLine(ListView1squadre.GetItem & CRLF )
End Sub
 

LucaMs

Expert
Licensed User
Longtime User
L'errore è, ovviamente, in Button2nuovo_Click (conviene sempre creare una routine con il codice da eseguire e nell'evento Click di un tasto chiamare la routine, non mettere tutto il codice. Anche il nome del tasto, meglio btnNuovaGiornata, altrimenti sprechi un sacco di caratteri per Button e nuovo non si sa cosa).

ListView2risultati.GetItem si usa con un indice per la riga (item) della listview che vuoi ottenere, cioè ListView2risultati.GetItem(indice).
WriteLine aggiunge in automatico un CRLF.

Se proprio vuoi fare in quel modo, dovresti fare:
B4X:
Sub Button2nuovo_Click
    SalvaDati
End Sub

Sub SalvaDati

    Dim salva As TextWriter
    salva.Initialize(File.OpenOutput(File.DirRootExternal, "Risultati.txt", False))

   ' Salva Squadre
    For i = 0 To ListView1squadre.Size - 1 ' <--- nome migliore lsvSquadre
      salva.WriteLine(ListView1squadre.GetItem(i))
    Next

    ' Salva Risultati
    For i = 0 To ListView2risultati.Size - 1
      salva.WriteLine(ListView2risultati.GetItem(i))
    Next

    salva.Flush ' per sicurezza
    salva.Close

End Sub

Poi puoi rileggere tutto con un metodo analogo, usando un TextReader invece di un TextWriter.

Però, non so cosa devi fare esattamente, in questo modo riuscirai a scrivere/leggere una giornata di campionato soltanto (visti i nomi, immagino si tratti di questo).

Se poi vuoi salvare una seconda giornata, saresti costretto ad usare un nuovo file di testo; cioè, invece di:
B4X:
salva.Initialize(File.OpenOutput(File.DirRootExternal, "Risultati.txt", False))

mettere:
B4X:
salva.Initialize(File.OpenOutput(File.DirRootExternal, "Risultati2.txt", False))

Potresti passare il numero della giornata di campionato:
B4X:
Sub SalvaDati(Giornata as Int)
e costruire il nome del file all'interno della routine:
B4X:
salva.Initialize(File.OpenOutput(File.DirRootExternal, "Risultati" & Giornata & ".txt", False))

Tutto questo, però, non è il metodo migliore.
Per fare le cose in modo ordinato e molto più pratico ed utile (e per poter in futuro gestire non solo un campionato di calcio, ma anche ricette di cucina, rubriche, cataloghi o qualunque altra cosa) dovresti usare un database SQLite, nel quale, per esempio, una tabella contiente i nomi delle squadre e un'altra i risultati.
 
Last edited:

tonyx67

Member
Ciao Luca grazie sempre della tua presenza. Ho letto che cè il metodo per salvare il setting dell'app. che è "statemanager" inoltre ho notato questo: (potrebbe servire ad altri membri..........penso)nell' activity_create se inserisco: listview1.addsingleline("Ciao") questo mi rimane anche se esco dall'app.
quindi ci vorrebbe un modo per salvare l'activity.....cosa ne pensi?;)
 

LucaMs

Expert
Licensed User
Longtime User
Penso che... sono io a ringraziare te :D
perché non conoscevo il modulo di Erel StateManager.

Lo sto guardando adesso e se il tuo scopo è quello di mantenere i dati che l'utente sta inserendo/scegliendo tra una uscita e l'altra dall'app, è quello che fà per te.

Quel modulo serve sia per salvare i settings (le impostazioni) generali dell'app (e quindi và bene anche per le preferenze dell'utente) sia per salvare i dati che temporaneamente si trovano nelle views (come la tua listview).

Quello che non avevo capito, e che a dire il vero ancora non capisco, è esattamente cosa devi fare. Se devi salvare i risultati immessi in quel momento dall'utente e basta, ok. Ma alla fine, non dovrai conservarli per uno scopo? (e in questo caso, i db SQLite sono l'ideale).

Cioè, se stai facendo in modo che l'utente gestisca il campionato di calcio, salvare i risultati che l'utente sta immettendo con StateManager va benissimo, ma poi non dovrai salvare i risultati di tutte le giornate che inserisce?

D'altra parte, se è così, sarebbe meglio che non li dovesse scrivere l'utente, ma che l'app li prelevasse da qualche sito affidabile.

Per capire bene Activity_Create, Activity_Pause e Activity_Resume, prepara un'app vuota, metti soltanto, in ognuna di esse un log col nome della sub, come: Log("Activity_Create")
poi esegui l'app, entra e riesci, e guarda i log.

Poi, sviluppa bene l'app, vendila meglio, guadagna molti milioni e passamene qualcuno :)
 

LucaMs

Expert
Licensed User
Longtime User
Ma che diavolo scrivo?

Sapere cosa deve fare la tua app mi serve davvero per darti ulteriori consigli, ma per fare quello che dicevi nel primo post (mannaggia a me e quando non leggo e rileggo bene)...

non devi fare altro che salvare i dati nel file nella routine Activity_Pause e rileggerli nella Activity_Resume!
 

tonyx67

Member
Ciao Luca in pratica l'utente ciò che rileggerà nelle listview e momentaneo perchè saranno risultati calcistici che poi a fine partita potranno essere pure cancellati.Come funziona l'app. ti spiego subito: Ho 3 button,una label,e una edittext.Inizialmente l'utente digita nella edittext. l'incontro es:" Lazio Roma"
clicca sul button1 chiamato "gioca" nella label sortisce un risultato es:"1-x".Cliccando sul button2 chiamato "nuovo" (in senso di nuovo incontro) si azzera la label,si azzera la edittext.e i risultati verranno visualizzati nella listview che è in modalità invisibile che poi verrà visualizzata cliccando sul button3 chiamato "i miei risultati".Per questo e importante anche se momentaneamente che l'utente possa verificare i risultati anche in un secondo momento,dopo se li vuole cancellarli bene altrimenti se li tiene.Che ne pensi? Ciao:)
 

LucaMs

Expert
Licensed User
Longtime User
Vediamo se ho capito.

L'utente immette i nomi delle squadre in una unica edittext ("Lazio - Roma").
clicka su "gioca" e l'app pronostica "1-x"

Poi vuole inserire un'altra partita, quindi clicka su "Nuovo" e riparte da sopra.

Ma tu vuoi che tutte le partite che inserisce, rimangano memorizzate in due listview (perché non in una sola?)
e su un file, in modo che si possano ricaricare le listview dai file.

Allora, la routine SalvaDati l'ho già postata sopra.
Ne prepari una LeggiDati e poi puoi usare dove e quando vuoi, no?
 

tonyx67

Member
Ciao Luca le listview sono 2 giusto per un fatto di gusto stando vicino le due listview in mezzo si crea anche una linea divisoria per un elenco piu ordinato..comunque.....seguendo l'esempio sopra non si crea un documento di testo nella directory stabilita e se cosi fosse sarebbe inutile perche come ho già detto l'utente visualizzerà i risultati per un certo tempo e dopo avrà la comodità di cancellarli solo nelle list.. e non dovrebbe cancellare il doc.dove stanno copiati i risultati...giusto o stò dicendo una ca...ta?
 

LucaMs

Expert
Licensed User
Longtime User
Ho fatto una piccola prova (le modifiche le fai tu, hehehehe).
Ho messo le listview in un pannello, così rendi invisibile quello, invece delle listview.

Comunque, non è il metodo migliore, eh!

Ciao
 

Attachments

  • LM_SalvaLvw.zip
    8.3 KB · Views: 234

LucaMs

Expert
Licensed User
Longtime User
Ciao Lu.. non me lo fa aprire che versione di b4a hai......

3.00

Se non puoi aprirlo, usa almeno le Sub:
B4X:
Sub Activity_Resume
    LeggiDati
End Sub

Sub Activity_Pause (UserClosed As Boolean)
    ' Attention: UserClosed will be True even if orientation changes.
    SalvaDati
End Sub

B4X:
Sub SalvaDati

    Dim Salva As TextWriter
    Salva.Initialize(File.OpenOutput(File.DirRootExternal, "Squadre.txt", False))

  ' Salva Squadre
    For i = 0 To ListView1Squadre.Size - 1
      Salva.WriteLine(ListView1Squadre.GetItem(i))
    Next
    Salva.Flush ' per sicurezza
    Salva.Close

    ' Salva Risultati
    Salva.Initialize(File.OpenOutput(File.DirRootExternal, "Risultati.txt", False))
    For i = 0 To ListView2risultati.Size - 1
      Salva.WriteLine(ListView2risultati.GetItem(i))
    Next
    Salva.Flush ' per sicurezza
    Salva.Close

End Sub

Sub LeggiDati

    Dim Leggi As TextReader
    Dim Lista As List
    Lista.Initialize

    ' Leggi Squadre
    If File.Exists(File.DirRootExternal, "Squadre.txt") Then
        Leggi.Initialize(File.OpenInput(File.DirRootExternal, "Squadre.txt"))

        Lista = Leggi.ReadList
        ListView1Squadre.Clear
        For i = 0 To Lista.Size - 1
            ListView1Squadre.AddSingleLine(Lista.Get(i))
        Next
        Leggi.Close
    End If

    ' Leggi Risultati
    If File.Exists(File.DirRootExternal, "Risultati.txt") Then
        Leggi.Initialize(File.OpenInput(File.DirRootExternal, "Risultati.txt"))
        Lista = Leggi.ReadList
        ListView2risultati.Clear
        For i = 0 To Lista.Size - 1
            ListView2risultati.AddSingleLine(Lista.Get(i))
        Next
        Leggi.Close
    End If

End Sub
 

tonyx67

Member
Ciao Luca quando pubblicherò quest'app il 70% sarà ai tuoi ringraziamenti.......funziooooona.unico neo e che crea 2 documenti di testo uno per le squadre e uno per i risultati sarebbe stato piu comodo crearne uno che comprendesse l'uno e l'altro sempre a mo di lista perche ultimamente che ho provato io il tutto non si visualizzava nelle listview ma solo nel doc.txt e non in ordine..comunque e un particolare che potrebbe essere pure trascurato tanto l'utente legge le list.Ultima domanda come conosci tutti questi codici hai qualche libro su b4a.bravo...bravo...bravo.........Ciao
 

LucaMs

Expert
Licensed User
Longtime User
Grazie, ma non è niente di particolare, anzi, andrebbe fatto molto meglio (se vuoi divertirti ed avere un unico file, dai un'occhiata alle Map)

Non ho libri su B4A, è che somiglia alle varie versioni di Visual Basic, soprattutto a VBNet e conosco la programmazione da ... secoli, sigh!

Comunque, sai che ci sono due pdf basilari, nella home del sito:

Basic4android Beginner's Guide (v2.6) and Code snippets: (Download)
Basic4android User's Guide (v1.3): (Download)

Quando pubblicherai la tua app spero che sarà scaricatissima.

Ciao
 
Top