Italian CustomListView e moltiplicazione

saslvovc

Member
Licensed User
Volevo chiedevi come fare una moltiplicazione fra EditText all'interno di una CustomListView.
 

udg

Expert
Licensed User
Ciao,
lo so che detta così ti aiuta il giusto, ma spero ti possa essere utile per imbastire qualcosa e poi eventualmente postare qui quello che hai realizzato se necessiti di ulteriore aiuto.
La CLV si basa sull'idea che ogni elemento della lista è un pannello il cui contenuto ti personalizzi come ti pare.
Ammettendo che uno di questi pannelli contenga le due EditText, la Label per il risultato e magari un Button per eseguire il calcolo (ma sì, abbondiamo), quello che dovresti fare è:
- individuare il pannello da cui è arrivato l'evento click sul button
- utilizzare il GetView() per puntare prima ad una e poi all'altra EditBox
- eseguire il calcolo
- utilizzare ancora GetView() per puntare alla Label ed aggiornarne il contenuto

Giusto per avere un'idea del codice, ammettendo che il pannello che ti interessa sia il terzo tra quelli inseriti e che tale posizione resti fissa (nel senso che non inserisci/rimuovi pannelli dalla CLV dopo averla creata), tanto per farla semplice:
B4X:
Dim pnl As Panel
pnl = clv1.getpanel(2)  'terzo panl della CLV
dim x1,x2,x3 as int 'o quello che ti serve
dim ed1 as EditText
ed1 = pnl.GetView(0) ' il primo elemento del panel è la prima edit
x1=ed1.text
ed1 = pnl.getView(1) 'il secondo elemento del panel è la seconda edittext
x2 = ed1.textDim lbl As Label
x3 = x1 * x2
lbl = pnl.GetView(2) ' la label del risultato è il terzo elemento del panel
lbl.text = x3
if x3 > 100 then lbl.color=colors.green else lbl.color=color.red 'tanto per fare qualcosa
Se invece la CLV è dinamica, allora copia il codice di Erel che mostra come utilizzare Sender per individuare il Button premuto e da questi risalire al panel che lo contiene; il resto rimane paraticamente invariato.

Nota: quello che precede è uno schema del tutto generico e scritto senza verificarne il reale funzionamento; serve solo per illustrare in forma di codice quanto detto prima.

Buon lavoro e.. buon divertimento con B4A!
 

saslvovc

Member
Licensed User
ho fatto qualcosa mi da questo errore:

LastException java.lang.ClassCastException: android.widget.textView cannot be cast to android widget.EditText

mio Codice

B4X:
Sub calcolo()
Dim pnl As Panel
edt.Initialize("edt")
pnl =LsvList.getpanel(2)  'terzo panl della CLV
Dim x1,x2,x3 As Int 'o quello che ti serve
Dim edt As EditText
edt = pnl.GetView(0) ' il primo elemento del panel è la prima edit
x1=edt.text
edt = pnl.getView(1) 'il secondo elemento del panel è la seconda edittext
x2 = edt.text
Dim lbl As Label
x3 = x1 * x2
Activity.Title = x3
End Sub
Quello che voglio realizzare e una CLV dinamica dove vanno inseriti le Label per la descrizione e delle EditText dove vado
ad inserire dei numeri che devono essere moltiplicati tra loro, a prescindere dal numero di EditText.
 

LucaMs

Expert
Licensed User
Purtroppo si deve considerare l'ordine in cui inserisci le view nel pannello.

Questa è una rogna non da poco.

Sarebbe utile poter "prelevare" una view da un pannello tramite il suo nome, non quel numero d'ordine piuttosto aleatorio (se poi fai una modifica al layout, adios!).

C'è una nuova libreria che dovrebbe permettere appunto di ricavare una view tramite il suo nome, ma non l'ho ancora provata.

La cerco e, se la trovo, pubblico qui il link (altrimenti, cercate, gente, cercate :))

http://www.b4x.com/android/forum/threads/b4a-activity-context-views-by-name.47847/
 

udg

Expert
Licensed User
Quindi vorresti realizzare qualcosa del tipo:
descrizione primo fattore
128.00
descrizione secondo fattore
2.00
descrizione terzo fattore
4.00
e poi un tasto "calcola" che andrebbe ad aggiungere un ultimo pannello tipo:
risultato del calcolo
1024.00

lasciando indefiito il numero di pannelli-fattore? E' forse ancora più semplice.
Ora vado a mangiare, poi se trovo conferma da parte tua ti inserisco un breve demo.

Umberto
 

saslvovc

Member
Licensed User
Si confermo la mia intenzione ma anziché fare il calcolo con un button vorrei usare
l'evento TextChanged.
 

LucaMs

Expert
Licensed User
Quello che voglio realizzare e una CLV dinamica dove vanno inseriti le Label per la descrizione e delle EditText dove vado
ad inserire dei numeri che devono essere moltiplicati tra loro, a prescindere dal numero di EditText.
Potresti ottenere tutti i numeri contenuti in tutte le EditText e moltiplicarli tra loro.

Non l'ho provato ma dovrebbe funzionare:

B4X:
Dim pnl As Panel
Dim lstNumbers As List : lstNumbers.Initialize

For Each v As View In pnl.GetAllViewsRecursive
    If v Is EditText Then
        Dim et As EditText = v
        lstNumbers.Add(et.Text)
    End If
   
    If lstNumbers.Size > 0 Then
   
        Dim Product As Long = lstNumbers.Get(0)
       
        For i = 1 To lstNumbers.Size -1
            Product = Product * lstNumbers.Get(i)
        Next
   
    End If
   
End Sub
 

udg

Expert
Licensed User
Non è che abbia pranzato finora, ma ho avuto visite e non sono riuscito a riguardare l'esempio che avevo preparato.
Il concetto è lo stesso di quello suggerito da LucaMs, ovvero iterare sui vari fattori e calcolare il prodotto.
Il mio esempio utilizza la CLV come richiesto. Ho preferito intercettare editText.EnterPressed invece del TextChanged perchè il secondo viene chiamato in continuazione (es. ogni carattere immesso) e presumo che interessi calcolare il totale solo quando il nuovo fattore sia imemsso del tutto e non parzialmente.
Ogni volta che immetti un nuovo fattore viene calcolato il prodotto (anche dopo aver immesso solo il primo fattore).
Se è quello che volevi, suggerisco di aggiungere un Button per azzerare tutto.
I colori improbabili servono solo per mostrare le varie aree.
 

Attachments

saslvovc

Member
Licensed User
Scusate il ritardo ma mi sono messo subito a lavorarci.
Grazie Ragazzi per i suggerimenti che mia avete dato, funziona tutto alla perfezione.

Salvatore
 
  • Like
Reactions: udg
Top