Italian Panel personalizzato su CustomListView

Fulvio75

Active Member
Licensed User
B4X:
sub CLWCustomPanelSelection(Index As Int)
    
    'Passare -1 a Index per deselezionare il CustomPanel selezionato
            
    'Deseleziono il pannello precedentemente selezionato
    If CLWSelectedIndex <> -1 Or Index = -1 Then
        'Colore del pannello customizzato contenuto nel pannello della CLW
        For Each CustomPanel As Panel In clwBatteryViewer.GetPanel(CLWSelectedIndex).GetAllViewsRecursive
            CustomPanel.Color = Colors.Transparent
        Next
    End If

    If Index <> -1 Then
        'Colore del pannello customizzato contenuto nel pannello della CLW
        For Each CustomPanel As Panel In clwBatteryViewer.GetPanel(Index).GetAllViewsRecursive
            CustomPanel.Color = Colors.Yellow
        Next
    End If
    
    'senza va in crash
    Sleep(1000)
    
End Sub
Ciao informazione, chiamo questa sub dall'evento itemclick di una customlistview, serve per cabiare il colore di un panel personalizzato quando ci clicco sopra e se non metto Sleep(1000) va in errore perché android.java non riesce a fare cast della view, come faccio ad aspettare lo svolgimento di questa sub senza inserire sleep(1000)?
Grazie
 

LucaMs

Expert
Licensed User
Modifica "il nome" così:
sub CLWCustomPanelSelection(Index As Int) As ResumableSub

e prima di End Sub:
Return True (o False, non ha importanza)


Poi, per chiamarla:
Wait For (CLWCustomPanelSelection(Index As Int)) Complete(Inutile As Boolean)


Lascia lo Sleep, magari 100, però.
 

Fulvio75

Active Member
Licensed User
Modifica "il nome" così:
sub CLWCustomPanelSelection(Index As Int) As ResumableSub

e prima di End Sub:
Return True (o False, non ha importanza)


Poi, per chiamarla:
Wait For (CLWCustomPanelSelection(Index As Int)) Complete(Inutile As Boolean)


Lascia lo Sleep, magari 100, però.
Grazie provo:)
 

Fulvio75

Active Member
Licensed User
Modifica "il nome" così:
sub CLWCustomPanelSelection(Index As Int) As ResumableSub

e prima di End Sub:
Return True (o False, non ha importanza)


Poi, per chiamarla:
Wait For (CLWCustomPanelSelection(Index As Int)) Complete(Inutile As Boolean)


Lascia lo Sleep, magari 100, però.
java.lang.ClassCastException: android.widget.TextView cannot be cast to android.view.ViewGroup
errore
 

Sagenut

Well-Known Member
Licensed User
Devi cambiare colore solo al pannello principale che contiene tutte le view dell'item?
 

Sagenut

Well-Known Member
Licensed User
Avevo capito che volevi che si colorasse l'item cliccato.
Invece nel panel dell'item tu hai un altro pannello e vuoi colorare solo quello?
 

Sagenut

Well-Known Member
Licensed User
B4X:
Sub Process_Globals
    dim selezionato as int = -1
End Sub



Sub CLV_ItemClick (Index As Int, Value As Object)
    dim p1, p2 as panel
    if selezionato < 0 then selezionato = index
    p1 = clv.getpanel(selezionato)
    p2 = p1.getview(0) 'Quì và specificato l'index giusto per accedere al pannello se non è la prima view
    p2.color = colors.transparent
    p1 = clv.getpanel(index)
    p2 = p1.getview(0) 'Quì và specificato l'index giusto per accedere al pannello se non è la prima view
    p2.color = colors.yellow
    selezionato = index
end sub
Se il tuo pannello aggiuntivo è solo 1 potrebbe funzionare così.
Ho ipotizzato che il panel sia la prima view del pannello, altrimenti devi modificare l'indice per puntare al pannello.
Ho buttato giù il codice senza provarlo quindi potrebbe contenere errori.
O magari essere proprio un errore totale. 🤣
 

Fulvio75

Active Member
Licensed User
B4X:
Sub Process_Globals
    dim selezionato as int = -1
End Sub



Sub CLV_ItemClick (Index As Int, Value As Object)
    dim p1, p2 as panel
    if selezionato < 0 then selezionato = index
    p1 = clv.getpanel(selezionato)
    p2 = p1.getview(0) 'Quì và specificato l'index giusto per accedere al pannello se non è la prima view
    p2.color = colors.transparent
    p1 = clv.getpanel(index)
    p2 = p1.getview(0) 'Quì và specificato l'index giusto per accedere al pannello se non è la prima view
    p2.color = colors.yellow
    selezionato = index
end sub
Se il tuo pannello aggiuntivo è solo 1 potrebbe funzionare così.
Ho ipotizzato che il panel sia la prima view del pannello, altrimenti devi modificare l'indice per puntare al pannello.
Ho buttato giù il codice senza provarlo quindi potrebbe contenere errori.
O magari essere proprio un errore totale. 🤣
se metto il mio codice per evidenziare il pannello in click della clw, tutto funziona, il problema è quando uso una sub fuori da click
 

Sagenut

Well-Known Member
Licensed User
La modifica che ti ha proposto @LucaMs già dovrebbe risolvere il problema.
Non capisco perché non funzioni.
 

Fulvio75

Active Member
Licensed User
La modifica che ti ha proposto @LucaMs già dovrebbe risolvere il problema.
Non capisco perché non funzioni.
Si funziona… è come la mia soluzione, funziona se la metto nell'evento click della clw, ma se richiamo sia il mio codice che il suo fuori dall'evento click della clw va in crash a meno che non metto sleep(1000)
 

Fulvio75

Active Member
Licensed User
B4X:
Sub clwBatteryViewer_ItemClick (Index As Int, Value As Object)
    
    'Deseleziono il pannello precedentemente selezionato
    If CLWSelectedIndex <> -1 Then
        'Colore del pannello customizzato contenuto nel pannello della CLW
        For Each CustomPanel As Panel In clwBatteryViewer.GetPanel(CLWSelectedIndex).GetAllViewsRecursive
            CustomPanel.Color = Colors.Transparent
        Next
    End If

    'Colore del pannello customizzato contenuto nel pannello della CLW
    For Each CustomPanel As Panel In clwBatteryViewer.GetPanel(Index).GetAllViewsRecursive
        CustomPanel.Color = Colors.Yellow
    Next
    
    CLWSelectedIndex = Index
    SelectedRecordId = clwDisplayedRecordsId.Get(Index)

    StartActivity(actBatteryDetails)
    actBatteryDetails.ReturnToActivity = "actBatteryStatus"
    actBatteryDetails.PageOpenMode = Functions.PageOpenMode.Edit
    actBatteryDetails.SelectedRecordId = SelectedRecordId
    
End Sub
Così funziona anche il mio codice, il problema è se lo richiamo al di fuori dall'evento click
 

Sagenut

Well-Known Member
Licensed User
Puoi postare anche la sub ItemClick?
 

Sagenut

Well-Known Member
Licensed User
Continuo a non capire come non possa funzionare con il metodo che ti ha illustrato @LucaMs
 

Sagenut

Well-Known Member
Licensed User
java.lang.ClassCastException: android.widget.TextView cannot be cast to android.view.ViewGroup
errore
L'unica cosa che potrebbe sembrare anomala è questa...
 

Fulvio75

Active Member
Licensed User
Continuo a non capire come non possa funzionare con il metodo che ti ha illustrato @LucaMs
B4X:
Sub clwBatteryViewer_ItemClick (Index As Int, Value As Object)
    
    Dim CLWPanel As Panel
    Dim CustomPanel As Panel
    
    CLWPanel = clwBatteryViewer.GetPanel(Index)
    
    'Deseleziono il pannello precedentemente selezionato
    If CLWSelectedIndex <> -1 Then
        CustomPanel = CLWPanel.GetView(0)
        CustomPanel.Color = Colors.Transparent   
    End If
    
    'Colore del pannello customizzato contenuto nel pannello della CLW
    CustomPanel = CLWPanel.GetView(0)   
    CustomPanel.Color = Colors.Yellow
    
'    'Deseleziono il pannello precedentemente selezionato
'    If CLWSelectedIndex <> -1 Then
'        'Colore del pannello customizzato contenuto nel pannello della CLW
'        For Each CustomPanel As Panel In clwBatteryViewer.GetPanel(CLWSelectedIndex).GetAllViewsRecursive
'            CustomPanel.Color = Colors.Transparent
'        Next
'    End If
'
'    'Colore del pannello customizzato contenuto nel pannello della CLW
'    For Each CustomPanel As Panel In clwBatteryViewer.GetPanel(Index).GetAllViewsRecursive
'        CustomPanel.Color = Colors.Yellow
'    Next
    
    CLWSelectedIndex = Index
    SelectedRecordId = clwDisplayedRecordsId.Get(Index)

    StartActivity(actBatteryDetails)
    actBatteryDetails.ReturnToActivity = "actBatteryStatus"
    actBatteryDetails.PageOpenMode = Functions.PageOpenMode.Edit
    actBatteryDetails.SelectedRecordId = SelectedRecordId
    
End Sub
Funziona ma solo in questo modo se nella sub Click così come lo vedi, se richiami il cambio colore in una sub esterna va in errore come se non avesse il tempo di elaborare il codice e funziona solo se metti sleep(1000)
 

Sagenut

Well-Known Member
Licensed User
Funziona ma solo in questo modo se nella sub Click così come lo vedi, se richiami il cambio colore in una sub esterna va in errore come se non avesse il tempo di elaborare il codice e funziona solo se metti sleep(1000)
Ma chiamando la Sub esterna con il Wait For il programma attende il suo completamento e poi ritorna alla riga successiva alla chiamata.
 
Top