Italian oggetto List visibile da tutte le activity

Sabotto

Well-Known Member
Licensed User
Vorrei dichiarare e riempire una List in Activity1, per poi leggerla in Activity2

Se provo a dichiararla in Process_Globals di Activity1, ottengo l'errore nella sub dove inizio a riempirla
B4X:
Sub Process_Globals
    'These global variables will be declared once when the application starts.
    'These variables can be accessed from all modules.
    Public lstcheckedItems As List
End Sub

Sub MostraIChecked
   
    'Crea una lista con tutti i partecipanti (quelli "checked")
    lstcheckedItems.Initialize
    For i = 0 To clvPartecipanti.GetSize - 1
        Dim p As B4XView = clvPartecipanti.GetPanel(i)
        If p.GetView(1).Checked Then
            lstcheckedItems.Add(p.GetView(0)) ' riga in rosso, vedi errore in screenshot allegato
        End If
    Next
   
    'la ordina in ordine alfaberico
    lstcheckedItems.SortCaseInsensitive(True)
   
End Sub
err1.png


Suggerisce di dichiararla in Globals, ma poi non sarebbe visibile da Activity2!
Come si fa?
 
D

Deleted member 103

Guest
Suggerisce di dichiararla in Globals, ma poi non sarebbe visibile da Activity2!
Come si fa?
Dichiara e inzializzzi la "List" nello Starter-Service.
 

udg

Expert
Licensed User
Longtime User
Non potresti semplicemente tener traccia del checked sugli elementi della CLV senza agggiungere una lista a parte? Ad esempio nel tag dei vari panenllini.
Oppure attivare una seconda CLV dove "copiare" i checked della prima.
Oppure una lista con gli indici (ammesso siano fissi) degli elemnti checked della clv ?

Edit: mi era sfuggito il discorso delel due diffenti Activtiy
 
Last edited:

giannimaione

Well-Known Member
Licensed User
Longtime User
La tua List contiene delle View, per questo non può essere dichiarata nella Process_Globals.

Usando le B4XPages non avresti questo problema.
@LucaMs ; pubblica un piccolo esempio per @Sabotto , utile anche per tanti altri.
 

LucaMs

Expert
Licensed User
Longtime User
Oppure una lista con gli indici (ammesso siano fissi) degli elemnti checked della clv ?
Infatti la cosa migliore (in assoluto sarebbero le B4XPages) è quella di creare la lista con i DATI (testi) prelevati in quel modo e passarli ad una routine di Activity2 che riempia la propria ListView (xCustomListView, sempre meglio).

Oltretutto non puoi ordinare una List contenente delle View; se invece contenesse i testi (eventualmente tipi personalizzati, se fossero più dati per ogni item) potresti farlo.
 
Last edited:
  • Like
Reactions: udg

udg

Expert
Licensed User
Longtime User
Mi era sfuggito che si parlava di due distinte Activity! In effetti B4xPages è la soluzione ad oggi migliore visto che entrambe sarebbero attive contemporaneamente. Vecchio stile funziona anche che ognuna abbia la sua clv, ma bisogna "riempire" la seconda grazie ai dati passati dalla prima (o condivisi).
 

udg

Expert
Licensed User
Longtime User
Hai dimenticato il sempre vero "non pubblicare commenti se non sei presente a te stesso"..
Mi suonava strano, ma per pigrizia non ho neanche riletto. In fondo l'unica parte valida era pensare ad un tipo di dati che prevedesse il "checked" tra le info gestite e creare una lista utilizzata da entrambe le activity per popolare le proprie clv.
Però, sono stato abbastanza sveglio da modificare il messaggio di questa mattina.
 

udg

Expert
Licensed User
Longtime User
Annamo bbene! Mi riferivo al post #4 di questo stesso thread.
Ma ormai direi che la questione sia ampiamente risolta.
 

udg

Expert
Licensed User
Longtime User
Se continuiamo così..ce menano!
 

Sabotto

Well-Known Member
Licensed User
Oltretutto non puoi ordinare una List contenente delle View; se invece contenesse i testi (eventualmente tipi personalizzati, se fossero più dati per ogni item) potresti farlo.
Infatti me ne ero accorto; ora ho cambiato ed uso
B4X:
 lstCheckedItemsi.Add(p.GetView(0).text
Quindi (se ho ben capito): o la dichiaro nel modulo Starter , o uso le B4XPages (un esempietto...? O basta dichiarare la List come B4XView?
Infine due precisazioni:
@udg: tu suggerisci (perlomeno è l'unica riga che non hai sbarrato) di "attivare una seconda CLV dove "copiare" i checked della prima."
Ma non ho ben capito cosa intendi. Questa seconda CLV dove la dichiarerei? Perchè avrebbe sempre il problema di dover essere visibile da Activity2.

@LucaMs: quando scrivi " creare la lista con i DATI (testi) prelevati in quel modo e passarli ad una routine di Activity2 che riempia la propria ListView (xCustomListView, sempre meglio). Intendi una cosa del genere?

B4X:
'In Activity2'
Public Sub PrendoLista(ListaSelezionati as List)
    'Faccio quello che devo fare con ListaSelezionati (che sarebbe lstCheckedItems)...
End Sub

'In Activity1
Sub PassoLaLista()

    Activity2.PrendoLista(lstCheckedItems)

End Sub
 
Last edited:

LucaMs

Expert
Licensed User
Longtime User
@LucaMs: quando scrivi " creare la lista con i DATI (testi) prelevati in quel modo e passarli ad una routine di Activity2 che riempia la propria ListView (xCustomListView, sempre meglio). Intendi una cosa del genere?
B4X:
'In Activity2'
Public Sub PrendoLista(ListaSelezionati as List)
    'Faccio quello che devo fare con ListaSelezionati (che sarebbe lstCheckedItems)...
End Sub

'In Activity1
Sub PassoLaLista()

    Activity2.PrendoLista(lstCheckedItems)

End Sub

Sì, se la ListaSelezionati contiene testi e non View. Dopo il commento: "Faccio quello che devo...", riempirai una xCustomListView caricata nella Activity2, esattamente come ne hai una, diciamo la "sorgente", nella Activity1


o uso le B4XPages (un esempietto...? O basta dichiarare la List come B4XView?
La List la riempi con testi e non con delle View (che è comunque il modo migliore, anche se usassi le B4XPages).
La List non è un oggetto grafico, come invece ListView o xCustomListView, quindi non puoi dichiararla come B4XView. Non voglio sviarti perché è giusto il codice che hai scritto sopra ed anche la logica; comunque, in generale: crei un layout tramite il Designer e fai generare a questo le dichiarazioni delle view come B4XView. Nel sorgente, ovunque ti serva, puoi temporaneamente "convertire" la B4XView nel suo tipo originale.

Ad esempio: ho una ImageView1 nel Designer. Da Designer genero la dichiarazione di questa ImageView1 come B4XView.
Nel sorgente, normalmente userò ImageView1 come B4XView, ovvero con tutte le proprietà ed i metodi che vedrai quando digiterai ImageView ed il punto.
Se però capitasse che qualche metodo/proprietà non fosse disponibile con la B4XView, farai una cosa del genere:
B4X:
#If B4A ' <--- per usare il codice anche con iOS-B4i
Dim iv As ImageView = ImageView1 ' <--- iv sarà di tipo originale ImageView di B4A, mentre ImageView1 è stato dichiarato come B4XView
iv.ProprietàNonDisponibileComeB4xView = ...
#End If

Risposta lunghetta, spero sufficientemente chiara.
 
Top