Italian Intent e Httjobs

alke32

Member
Salve a tutti, premetto che sono alle prime armi, quindi non stupitevi della mia ignoranza a riguardo.
Espongo il mio problema:

Nel Sub del Job ho questa definizione che in se è corretta
B4X:
PostID = Person.Get("ID")

Il mio problema è che voglio che questo PostID con il .Get venga poi usato nel

B4X:
Sub PersonsListview_ItemClick (Position As Int, Value As Object)

In modo che la stringa dell'id tramite l'intent venga poi riportata nella nuova Activity.
Essendo dichiarata nel Job come posso fare per poterla utilizzare pure li?


Credo di aver detto tutto ma per qualsiasi domanda chiedete pure
 
Last edited:

LucaMs

Expert
Licensed User
Longtime User
Avrai pure detto tutto, ma io non c'ho capito un tubo (spero che sia solo perché ho fatto nottata e non perché oramai la demenza senile avanza :D).

Comunque, "tiro a indovinare": vuoi fare in modo che il valore di PostID venga ricevuto nell'evento PersonsListview_ItemClick?

Se è così, dovrai usare:
B4X:
PersonsListview.AddSingleLine2("Nome Persona", PostID)
quando aggiungi una persona. Il Value dell'evento PersonsListview_ItemClick conterrà il PostID.
 

alke32

Member
Più probabile che soffra io di demenza senile :D

Torniamo a noi, ti riporto spezzoni di codice che magari ti faranno capire meglio quel che intendo fare, però prima ti spiego cosa vorrei uscisse in tal caso risolvessi questo problema.

Tramite il Job vado a prendere dei dati da un Database MySql hostato online, nei record che esso preleva c'è un ID che vorrei venisse utilizzato per recuperare le informazioni di quel determinato prodotto e visualizzarle in un altra Activity.

Vorrei specificare che le informazioni le prende e le vede nella main Activity infatti ho la lista dei prodotti, però ripeto nella seconda activiy non saprei come fare.

Passiamo al codice:
B4X:
Sub Activity_Create(FirstTime As Boolean)

    'Do not forget to load the layout file created with the visual designer. For example:
    Activity.LoadLayout("1")
    Activity.Title = "Home"   
    ServerIP = "L'IP DEL MYSQL" ' The ip address where you Xampp installation runs
    Dim GetPersons As HttpJob
    GetPersons.Initialize("GetP", Me)
    GetPersons.download2("http://" & ServerIP & "/persons.php", Array As String ("action", "GetPersons"))
    Activity.AddMenuItem("Aggiorna", "aggiorna")
End Sub

Ora il Job
B4X:
Sub JobDone(Job As HttpJob)
    ProgressDialogHide
    If Job.Success Then
        Dim res As String
        res = Job.GetString
        Log("Back from Job:" & Job.JobName )
        Log("Response from server: " & res)
        Dim parser As JSONParser
        parser.Initialize(res)
        Select Job.JobName
            Case "GetP"
                Dim ListOfPersons As List
                Dim NomeCanale As String   
                Dim PostData As String
                Dim PostID As Int                
                ListOfPersons = parser.NextArray 'returns a list with maps
                PersonsListview.Clear
                If ListOfPersons.Size = 0 Then
                    PersonsListview.AddSingleLine ("Per favore Aggiorna")
                Else
                    For i = 0 To ListOfPersons.Size - 1
                        Dim Person As Map
                        Person = ListOfPersons.Get(i)
                        PostID = Person.Get("ID")
                        PostData = Person.Get("post_date")       
                        NomeCanale = Person.Get("post_title")
                        If PostID = PostID Then           
                            PersonsListview.AddTwoLinesAndBitmap(NomeCanale, PostData & " - "& PostID, LoadBitmap(File.DirAssets, "favicon.png"))                       
                        Else
                            ToastMessageShow("Error", True)
                        End If
                    Next
                End If
            Case "CountP"
            Case "InsertNewP"
                'Do nothing
            Case "Articolo"
                'Do nothing
        End Select
    Else
        ToastMessageShow("Error: " & Job.ErrorMessage, True)
    End If
    Job.Release
End Sub


Poi ho l'itemclick
B4X:
Sub PersonsListview_ItemClick (Position As Int, Value As Object)
        
    StartActivity(readarticle)
              
End Sub

Vorrei che mi aiutaste a mandare questo dato dell'id (Generato nel JOB) nell'altra activity in modo poi da potermi muovere e recuperare il tutto.
Scusami Luca se mi son di nuovo spiegato male
 

LucaMs

Expert
Licensed User
Longtime User
Ti sei spiegato bene, invece.

C'è un errore:
B4X:
If PostID = PostID Then


Qui, invece:
B4X:
PersonsListview.AddTwoLinesAndBitmap(NomeCanale, PostData & " - "& PostID, LoadBitmap(File.DirAssets, "favicon.png"))
Se usi le "versioni 2", puoi aggiungere il valore di ritorno:
B4X:
PersonsListview.AddTwoLinesAndBitmap2(NomeCanale, PostData & " - "& PostID, LoadBitmap(File.DirAssets, "favicon.png"), PostID))

Poi, per passare PostID ad un'altra activity, puoi fare in due modi (almeno):
1) dichiari una variabile pubblica globale (quindi nella Process_Globals) nell'activity readarticle ed imposti il suo valore con PostID prima di avviare readarticle:

in readarticle:
B4X:
Sub Process_Globals
    Public IDAttuale As Int
End Sub

nella Main:
B4X:
Sub PersonsListview_ItemClick (Position As Int, Value As Object)
    readarticle.IDAttuale = Value
    StartActivity(readarticle)
End Sub



2) senza variabile globale, puoi attivare readarticle chamando una sua routine pubblica alla quale passare PostID:
in readarticle:
B4X:
Public Sub FaiQuesto(ID as Int)
End Sub

nella Main:
B4X:
Sub PersonsListview_ItemClick (Position As Int, Value As Object)
    CallSubDelayed2(readarticle, "FaiQuesto", Value)
End Sub

CallSubDelayed2 (e sue varianti) lanciano una routine in un'altra activity ma questa viene avviata (visualizzata) soltanto al termine dell'esecuzione di tutte le istruzioni dell'attività chiamante successive a CallSubDelayed2 (ovviamente quelle nella routine in cui avviene la chiamata, nell'esempio, Sub PersonsListview_ItemClick, subito dopo CallSubDelayed2 non c'è niente e quindi readarticle sarà avviata immediatamente).
 

LucaMs

Expert
Licensed User
Longtime User
Eh, la tua domana è arrivata soltanto adesso!

Te l'ho scritto:
Se usi le "versioni 2", puoi aggiungere il valore di ritorno:
B4X:
PersonsListview.AddTwoLinesAndBitmap2(NomeCanale, PostData & " - "& PostID, LoadBitmap(File.DirAssets, "favicon.png"), PostID))

è chiaro che dovrai posizionare questo codice all'interno del Job Done (a meno che non memorizzi in una variabile - List, Map o array- a livello di modulo i PostID arrivati).
 

alke32

Member
Si avevo scritto senza prima provare, funziona alla grande :D Ti ringrazio davvero tanto!

Per un altro problema riguardante alla customlistview devo aprire un altro thread?
 

LucaMs

Expert
Licensed User
Longtime User
Prego.

Beh, sarebbe meglio, perché probabilmente sarebbe letto da un numero maggiore di italiani.

Comunque, chiedi anche qui, volendo.


(ringraziami con un migliaio di "Like" sullo stesso post - non se puede -, così raggiungo i "migliori", hehehe)
 

alke32

Member
No va beh niente di che praticamente ho importato la classe nel mio progetto solo che dal designer non posso scegliere il tipo o comunque non riesco a utilizzarlo
 

LucaMs

Expert
Licensed User
Longtime User
Anche questo tuo post è arrivato soltanto poco fa (infatti, guarda qui). Non capita spesso, però.

Quindi la tua classe è una Custom View?
Affinché sia riconosciuta come tale dal Designer, deve contenere queste due routine:

B4X:
Public Sub Initialize (vCallback As Object, vEventName As String)


Public Sub DesignerCreateView(base As Panel, lbl As Label, props As Map)


Vedi:
https://www.b4x.com/android/forum/threads/custom-view-with-designer-support.28953/#content
 

alke32

Member
Si mi stavo preoccupando visto che leggevo che rispondevi a tutti e il mio post ancora non era stato accettato.

Comunque si, ho seguito alla lettera quel post ma resta sempre così il problema
 

Attachments

  • sddvv.PNG
    sddvv.PNG
    5.3 KB · Views: 173
Top