Italian [B4A/B4J] Crash B4XDialog + B4XSearchTemplate + B4XListTemplate + Lazy Loading

Elric

Well-Known Member
Licensed User
Ciao,

ho voluto creare due nuovi B4XDialog template:
1. implementazione del lazy loading in B4XListTemplate
2. fusione di B4XSearchTemplate + B4XListTemplate con l'implementazione del lazy loading - nome: B4XSearchListLazyTemplate

Per il lazy loading ho usato la libreria PreoptimizedCLV, che ha come "unico" problema che i colori della customlistview non sono gestibili.

Il problema principale è il template n. 2, B4XSearchListLazyTemplate, e ce l'ho solo in B4A.

Quando lo visualizzo la prima volta nessun problema. Quando lo visualizzo per la seconda volta va in crash:
B4X:
Logger connesso a:  HUAWEI WAS-LX1A
--------- beginning of system
--------- beginning of main
*** Service (starter) Create ***
** Service (starter) Start **
** Activity (main) Create (first time) **
Index time: 368 ms (10000 Items)
PCLV.pnlOverlay.Width - PCLV.B4XSeekBar1.mBase.Left 125
Width: 1080 - PCLV.pnlOverlay.Width: 900
Call B4XPages.GetManager.LogEvents = True to enable logging B4XPages events.
** Activity (main) Resume **
intResult = -3
Cancel
0
1
2
3
4
5
6
7
8
9
10
11
Error occurred on line: 117 (cB4XSearchListLazyTemplate)
java.lang.RuntimeException: Object should first be initialized (View).
Did you forget to call Activity.LoadLayout?
    at anywheresoftware.b4a.AbsObjectWrapper.getObject(AbsObjectWrapper.java:67)
    at anywheresoftware.b4a.objects.B4XViewWrapper.GetView(B4XViewWrapper.java:335)
    at b4a.example3.customlistview._getpanel(customlistview.java:440)
    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:348)
    at anywheresoftware.b4a.shell.Shell.raiseEvent(Shell.java:255)
    at java.lang.reflect.Method.invoke(Native Method)
    at anywheresoftware.b4a.ShellBA.raiseEvent2(ShellBA.java:157)
    at anywheresoftware.b4a.debug.Debug.delegate(Debug.java:262)
    at b4a.example.cb4xsearchlistlazytemplate._update(cb4xsearchlistlazytemplate.java:715)
    at b4a.example.cb4xsearchlistlazytemplate$ResumableSub_Show.resume(cb4xsearchlistlazytemplate.java:902)
    at anywheresoftware.b4a.shell.DebugResumableSub$DelegatableResumableSub.resumeAsUserSub(DebugResumableSub.java:48)
    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:157)
    at anywheresoftware.b4a.BA.raiseEvent(BA.java:201)
    at anywheresoftware.b4a.shell.DebugResumableSub$DelegatableResumableSub.resume(DebugResumableSub.java:43)
    at anywheresoftware.b4a.keywords.Common$14.run(Common.java:1801)
    at android.os.Handler.handleCallback(Handler.java:808)
    at android.os.Handler.dispatchMessage(Handler.java:101)
    at android.os.Looper.loop(Looper.java:166)
    at android.app.ActivityThread.main(ActivityThread.java:7529)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:245)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:921)

In B4J invece fila liscio.

L'errore lo dà la riga "Dim p As B4XView = CustomListView1.GetPanel(i)".

Ho messo un log per capire se ci fosse un panel particolare ma variano. A volte 2, a volte 7, questa volta 11.

Mi resta sempre il problema dei colori usando PreoptimizedCLV che impatta sulla selezione degli item della customlistview e sul colore delle lettere quando uso il search (normalmente le lettere in ricerca si colorano di rosso), ma rispetto al crash è un problema minore.

Suggerimenti o soluzioni?

Grazie in anticipo!

Edit: progetto corretto allegato.
 

Attachments

  • glbB4XSearchListOptTemplate.zip
    95.6 KB · Views: 8
Last edited:

LucaMs

Expert
Licensed User
Longtime User
Scarico adesso (alle 5 di mattina :confused: 😄) il progetto che hai allegato ma con poche speranze, perché con un eufemismo potrei dire di non aver capito "molto" ciò che vuoi creare.


P.S. Già mi spaventano tutte quelle classi 😄 :
1758770296061.png



P.P.S. Per comodità uso il progetto B4J, visto che nel titolo hai scritto che sia per B4A-B4J, ma vedo subito:

1758770450941.png

cosa già sospetta.
Alura, apro anche la versione B4A (benché non mi vada affatto di installarla nello smartphone), sperando che quei warning non ci siano.

... e infatti non ci sono.
 
Last edited:
Upvote 0

LucaMs

Expert
Licensed User
Longtime User
Come primo suggerimento, senza aver compilato e nemmeno guardato il codice (i codici) sorgente, suggerirei di dare alle view nei layout dei nomi NON generici.

In particolare, hai una CustomListView1 nel layout "listtemplate" (mia - credo buona - abitudine: prefisso per i nomi di layout "lay") e un'altra con lo stesso nome nel layout "searchtemplate".

Dato che (suppongo al 99%) saranno caricati entrambi nella stessa View finale, andranno certamente in conflitto.

DaTEME retta, 'na vorta tanto, non lasciate i nomi di default delle View, mai, nemmeno se state facendo solo delle prove, sia per il motivo di cui sopra, eventuali conflitti, sia perché leggendo il sorgente che avrete scritto, quando vedrete EditText1, ad esempio, vi domanderete: "ma che c. ci andrà scritto, a cosa servirà?".

Se poi seguiste anche la mia prassi di usare il prefisso "lay" per i file di layout - ad esempio: laySearchTemplate:

1 - li vedrete consecutivi nella "cartella" (virtuale) Files dell'IDE
2 - quando scriverete: xxx.LoadLayout("lay <--- qui sareste facilitati nello scegliere quale layout)
 
Last edited:
Upvote 0

LucaMs

Expert
Licensed User
Longtime User
Non credo sia "il" problema (semmai quello delle due CustomListView1) ma c'è un Try-Catch vuoto e quindi inutile.
E siccome ho un certo appetito, sospendo e COLAZIONO (*)

(*) Andate a dire a tre-cani, due-gatti e tutto lo zoo, che quel termine, "Colaziono/colazionare", va aggiunto!

Pranzo (sostantivo) -> Pranzare
Cena -> Cenare

QUINDI:

Colazione -> Colazionare (io Colaziono, tu Colazioni, ...)
Merenda -> Merendare (io Merendo, tu Merendi, ...)

Oh, farà ridere ma sono serissimo! Come sempre, del resto 😄
 
Upvote 0

Elric

Well-Known Member
Licensed User
Ciao, intanto grazie per l'interessamento "albeggiante".

Devo aver di nuovo sbagliato allegato, perché due classi sono "vecchie", ossia inutili, primordiali doppioni e avrei dovuto rimuoverle, e dei layout dovrebbero essere altrove. Credevo di averlo fatto.

Sui nomi dei layout e delle view sfondi una porta aperta, ma essendo i layout estrapolati dalla libreria XUIViews, non li ho toccati. L'unico layout che ho aggiunto segue la convenzione "lay" come prefisso.

Resta il vero problema che è il crash quando si apre per la seconda volta il dialogo basato su B4XSearchListLazyTemplate.
 
Upvote 0

LucaMs

Expert
Licensed User
Longtime User
Ciao, intanto grazie per l'interessamento "albeggiante".

Devo aver di nuovo sbagliato allegato, perché due classi sono "vecchie", ossia inutili, primordiali doppioni e avrei dovuto rimuoverle, e dei layout dovrebbero essere altrove. Credevo di averlo fatto.

Sui nomi dei layout e delle view sfondi una porta aperta, ma essendo i layout estrapolati dalla libreria XUIViews, non li ho toccati. L'unico layout che ho aggiunto segue la convenzione "lay" come prefisso.

Resta il vero problema che è il crash quando si apre per la seconda volta il dialogo basato su B4XSearchListLazyTemplate.
Appunto, ancora non era l'alba, ho scaricato, guardato, COLAZIONATO (!) e... mi sono riaddormentato, per cui non ho scovato l'errore (per il momento, almeno).

Le due CustomListView1, in questo caso non vanno in conflitto (quasi certamente ci andrebbero se stessero in due B4XPages, entrambe aperte, anche se visualizzate una alla volta).

Il crash avviene quando inizi a digitare nella SearchView (ma questo lo sai).
Per ora, ti suggerisco solo una cosa utile per il debugging di progetti di tipo B4XPages:

Nel Main (nel codice sotto, B4A, ma vale lo stesso discorso per B4J e B4I):
Main:
#IF NOT(DEBUG)

Sub Activity_Resume
    B4XPages.Delegate.Activity_Resume
End Sub

Sub Activity_Pause (UserClosed As Boolean)
    B4XPages.Delegate.Activity_Pause
End Sub

#End If

Questo perché quando sei in modalità Debug e vuoi eseguire il programma passo-passo (F8) senza quel codice ti ritrovi a passare per quelle due Sub, Resume e Pause, e non riesci ad eseguire un debugging come si deve.

Più tardi proverò a scovare l'errore, cosa non facilissima (di certo sarebbe più comodo farlo con B4J).
 
Upvote 0

LucaMs

Expert
Licensed User
Longtime User
E' davvero difficile scoprire il bug, soprattutto perché non ho mai nemmeno smanettato con PreoptimizedCLV.
Mi pare di capire che tu abbia aggiunto a quella classe il metodo AddItemsToList, mentre nel tutorial di Erel vedo che usa soltanto AddItem.
Molto ma molto probabilmente il problema è lì.
Prova ad usare AddItem nel sorgente del progetto e vedere se funziona.
 
Last edited:
Upvote 0
Top