Italian CustomListView Info (diciamo per il momento RISOLTO)

GIS

Well-Known Member
Licensed User
Ciao, sto utilizzando questo esempio https://www.b4x.com/android/forum/threads/cards-list-with-customlistview.87720/#content
Ovviamente l'ho modificato totalmente e adesso quando premo su una label l'utente può modificarla. Il mio problema che che avrei bisogno di fare un'aggiornamento della listView dopo che l'utente ha fatto la sua modifica alla scheda. C'e un modo semplice per farlo? Non volevo chiudere l'activity per poi riaprirla.
Grazie
 

udg

Expert
Licensed User
Longtime User
Ciao, premetto che non ho scaricato quell'esempio e quindi vado un po' a senso rispetto alla tua richiesta.
Presumo che, a seguito di un click su uno dei pannelli/card , mostri un pannello in sovrimpressione (o utilizzi dello spazio extra nell'activity) per consentire all'utente tramite una EditText di inserire un nuovo valore.
Se è così, quando l'utente conferma il nuovo valore (potresti verificare che sia davvero diverso dal precedente per evitare operazioni inutili), non ti resta che accedere nuovamente al pannelo della CLV da cui avevi tratto il valore corrente e poi alla label (presumo) che contiene la vecchia descrizione da sostituire.
La label la ottieni con getview(x) del panel di cui sopra (rimediato tramite Sender che ti fa puntare a quello su cui è avvenuto il click).
 

GIS

Well-Known Member
Licensed User
ciao, si tuo ragionamento è corretto. Non capisco come usare getview(x). Cmq ho risolto con questo codice che funziona. Perciò ho risolto in questo modo.
se hai voglia di spiegarmi il Getview(x). A volte quando scrivo un problema che ho mi vengono dei flash per risolvere il problema. Bho!!!
B4X:
For i = CLV1.Size -1  To 0 Step -1
        CLV1.RemoveAt(i)
    Next

Forse intendevi GetItemFromView(x), ma poi come faccio ha fare l'aggiornamento di una scheda precisa?
Si fa per caso con InsertAt.

B4X:
Dim index As Int = CLV1.GetItemFromView(Sender)

CLV1.InsertAt(CreateItem(CLV1.AsView.Width, Titolo,Titolo1,Titolo2, Legno,Cibo,Ferro,Mitrhil, content, content1, content2, content3, contentBis, content1Bis, content2Bis, content3Bis), "")
Sto andando a naso, so che è sbagliata. Da errore di parametro non corretto.Ma index dove lo metto?
 
Last edited:

udg

Expert
Licensed User
Longtime User
Non mi è chiaro, volevi eliminare tutti gli elementi dalla CLV?
Avevo capito che intendessi aggiornarne uno tra i tanti in base a dati nuovi forniti in input dall'utente.
 

GIS

Well-Known Member
Licensed User
si, se si riusciva solo uno. Io ho fatto cosi perchè ci sono arrivato prima a trovare la soluzione
 

udg

Expert
Licensed User
Longtime User
Capito. Mi spiace di non avere con me il PC e non poterti aiutare meglio.
In generale, se non hai urgenza, dovresti cercare di far funzionare la strada maestra: selezione del pannello che ti interessa, selezione della label (o componente) da aggiornare, modifica dei dati. Se poi tutte le label dello stesso tipo (es. descrizione) di tutti i panelli aggiunti alla xCLV hanno lo stesso evento, allora puoi ricavare direttamente la label che ti interessa ed operare su di essa.
 

GIS

Well-Known Member
Licensed User
Ok. Cmq grazie. Per adesso resto cosi. Se poi tu o un'altro ha voglia di spiegarmi meglio modificherò il codice.
 

GIS

Well-Known Member
Licensed User
E' molto semplice ed è come @udg ti ha spiegato, molto sinteticamente. Allego un esempio.


Grazie. l'ho compilato ma in esecuzione mi da errore. Forse mi manca qualcosa? io ho queste librerie.
Cattura1.PNG
Cattura.PNG
 

Sagenut

Expert
Licensed User
Longtime User
Giusto per informazione, anche io ottengo lo stesso errore.
La riga incriminata è quella del Activity.LoadLayout
Strano.
Per caso hai il nuovo B4A e sei passato ad AndroidX?
Comunque l'esempio è facilmente comprensibile anche solo leggendo il codice.
Consiglio a @GIS di modificare il suo codice sfruttando quello postato da @LucaMs.


*** EDIT ***
La causa è comunque nella CustomListView.
@GIS :
per risolvere apri il LayMain nel designer, elimina la CustomListView e poi aggiungila di nuovo.
In questo modo inizia a funzionare.
 
Last edited:

LucaMs

Expert
Licensed User
Longtime User
Giusto per informazione, anche io ottengo lo stesso errore.
La riga incriminata è quella del Activity.LoadLayout
Strano.
Per caso hai il nuovo B4A e sei passato ad AndroidX?
Comunque l'esempio è facilmente comprensibile anche solo leggendo il codice.
No, ho la versione 8.80 di B4A.
Cmq, provate ad eliminare la CustomListView nel Designer, salvare, riaprire e mettere la vosta (clv).

Magari pubblicate il messaggio d'errore completo (a dx è tagliato, nell'immagine sopra).
 

Sagenut

Expert
Licensed User
Longtime User
Errore:
Class not found: b4a.example.customlistview, trying: b4a.example.customlistview
Error occurred on line: 33 (Main)
java.lang.RuntimeException: java.lang.ClassNotFoundException: b4a.example.customlistview
at anywheresoftware.b4a.keywords.LayoutBuilder.loadLayout(LayoutBuilder.java:170)
at anywheresoftware.b4a.objects.ActivityWrapper.LoadLayout(ActivityWrapper.java:209)
at b4a.example.main._activity_create(main.java:389)
at java.lang.reflect.Method.invoke(Native Method)
at anywheresoftware.b4a.shell.Shell.runMethod(Shell.java:732)
at anywheresoftware.b4a.shell.Shell.raiseEventImpl(Shell.java:351)
at anywheresoftware.b4a.shell.Shell.raiseEvent(Shell.java:255)
at java.lang.reflect.Method.invoke(Native Method)
at anywheresoftware.b4a.ShellBA.raiseEvent2(ShellBA.java:144)
at b4a.example.main.afterFirstLayout(main.java:104)
at b4a.example.main.access$000(main.java:17)
at b4a.example.main$WaitForLayout.run(main.java:82)
at android.os.Handler.handleCallback(Handler.java:873)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:193)
at android.app.ActivityThread.main(ActivityThread.java:6669)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
Caused by: java.lang.ClassNotFoundException: b4a.example.customlistview
at java.lang.Class.classForName(Native Method)
at java.lang.Class.forName(Class.java:453)
at java.lang.Class.forName(Class.java:378)
at anywheresoftware.b4a.keywords.LayoutBuilder.loadLayoutHelper(LayoutBuilder.java:390)
at anywheresoftware.b4a.keywords.LayoutBuilder.loadLayoutHelper(LayoutBuilder.java:454)
at anywheresoftware.b4a.keywords.LayoutBuilder.loadLayout(LayoutBuilder.java:148)
... 18 more
Caused by: java.lang.ClassNotFoundException: Didn't find class "b4a.example.customlistview" on path: DexPathList[[zip file "/system/framework/org.apache.http.legacy.boot.jar", zip file "/data/app/b4a.example-2QTPn1kFYL2adrNo3biNdw==/base.apk"],nativeLibraryDirectories=[/data/app/b4a.example-2QTPn1kFYL2adrNo3biNdw==/lib/x86_64, /system/lib64]]
at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:134)
at java.lang.ClassLoader.loadClass(ClassLoader.java:379)
at java.lang.ClassLoader.loadClass(ClassLoader.java:312)
... 24 more
 

LucaMs

Expert
Licensed User
Longtime User
Mah. Direi che o per il fatto che la mia xCLV è nella cartella delle librerie aggiuntive mentre la vostra è in quella delle librerie interne (eppure dovrebbe trovarla comunque) ed in questo caso facendo come suggerito nel post precedente dovrebbe andare a posto, oppure che io ho B4A nella cartella Programmi, quindi per i 64 bit, e voi nella Programmi (x86), 32 bit.
 

Sagenut

Expert
Licensed User
Longtime User
@GIS
Se nella CLV clicchi sul pannello di un Item (proprio sul pannello, non su una view contenuta nel pannello) ottieni la sua posizione in lista, INDEX.
Con questo valore puoi effettuare il RemoveAt, InsertAt e via dicendo.
Per ottenere lo stesso valore cliccando su una qualsiasi delle View contenute nel pannello Item che ti interessa puoi fare così:
B4X:
Sub EventoTuaView_Click
     Dim provvisoria As View = Sender  '<= Crea un Clone/Riferimento alla View su cui hai cliccato
     Dim posizione As Int = CLV.GetItemFromView(provvisoria) '<= Ottiene l'Item, o INDEX, dalla View
End Sub
 

udg

Expert
Licensed User
Longtime User
Ho trovato un vecchio test che utilizzava la CLV (non xCLV) e che mostra come utilizzare i click su elementi qualunque inclusi nei vari pannelli aggiunti alla lista.
Qui hai incremento/decremento di una quantità (a sx il decremento anche se usa la stessa icona dell'incremento).
Attenzione che per abitudine tutti i miei layout hanno un panel di fondo (bckpnl) configurato in genere per utilizzare tutto lo spazio del contenitore che carica il layout; in questo modo ho pieno controllo sullo sfondo (graficamente ed eventuali eventi).

La classe CustomListView176 non è altro che la CLV versione 1.76 standard con nome alterato per distinguerla da altre versioni.

In questo esempio, ogni pannello della CLV è costituito da 3 pannelli (uno per prodotto) di cui il primo lasciato vuoto (per semplice capriccio eheh). Ciascuno dei tre pannelli ha un layout definito in lytCell, ovvero immagine, titolo, sottotitolo, quantità e tasti di incremento decremento.

Le varie "righe" della CLV contengono nell'esempio sempre gli stessi tre pannelli, giusto per non dover effettuari sforzi di fantasia inutili (nella realtà prenderebbe dati da un DB o almeno un file).
 

Attachments

  • GridTest.zip
    124.1 KB · Views: 229
Last edited:

udg

Expert
Licensed User
Longtime User
Lo stesso di prima ma usando xCLV invece di CLV. Incremento e Decremento sono ora label che usano FontAwesome per mostrare i simboli.
Avevo qualche minuto libero e ho pensato che potesse essere utile anche questa versione.
Ovviamente anche questo codice è da considerarsi puramente indicativo. Si potrebbe (in realtà dovrebbe) sistemare meglio in diversi punti, ma ho preferito lasciare una evidente corrispondenza con il precedente.
 

Attachments

  • GridTextX.zip
    121.5 KB · Views: 256

GIS

Well-Known Member
Licensed User
ciao, grazie a tutti.... ieri non ero entrato nel forum entro oggi e vedo una sfilza di messaggio e mi dico: cos'è successo..... strano che nn mi siano arrivate email.....
 
Top