Italian B4I listview - tableview ma come funziona?

fifiddu70

Well-Known Member
Licensed User
Longtime User
Ciao a tutti, premetto che odio aplle ma per forza di cose ci devo convivere, ho realizzato in b4a una semplice app che usava una editetxt un pulsante ed una listview, nella editext scrivevo un piccolo testo che premendo il pulsante lo aggiungevo alla listview, se volevo rimuovere un elemento dalla listview lo eliminavo con un semplie riga di comando, ma torniamo a noi....
vorrei fare la stessa cosa con b4I ma non riesco a capirci come funziona sta benedetta tableview, qualcuno potrebbe essere gentile da farmi un pezzetto di codice per capire come aggiungere un elemento da edtitext sulla tableview e come rimuovere il singolo elemento?
questo e quello che avevo fatto io ma premendo il pulsante non si aggiunge alla tableview:
B4X:
Sub Process_Globals
    'These global variables will be declared once when the application starts.
    'Public variables can be accessed from all modules.
    Public App As Application
    Public NavControl As NavigationController
    Private Page1 As Page
    Dim txtordine As TextField
    Private btnaggiungi As Button
    Dim lsw As TableView
End Sub

Private Sub Application_Start (Nav As NavigationController)
    'SetDebugAutoFlushLogs(True) 'Uncomment if program crashes before all logs are printed.
    NavControl = Nav
    Page1.Initialize("Page1")
    Page1.Title = "prova 1.0"
    Page1.RootPanel.Color = Colors.RGB (6, 82, 140)
    NavControl.ShowPage(Page1)
    lsw.Initialize("lsw",False)
    btnaggiungi.Initialize("btnaggiungi",btnaggiungi.STYLE_SYSTEM)
    btnaggiungi.Text = "AGGIUNGI"
    btnaggiungi.SetBorder(2,Colors.Black,8)
    btnaggiungi.SetShadow(Colors.Black,3,3,1,True)
    btnaggiungi.Color=Colors.LightGray
    txtordine.Initialize("txtordine")   
    Page1.RootPanel.AddView(txtordine, 3%x,1%y,70%x,9%y)
    Page1.RootPanel.AddView(btnaggiungi, 73%x,1%y,26%x,10%y)
    Page1.RootPanel.AddView(lsw,3%y,11%y,95%x,50%y)

End Sub

Sub btnaggiungi_Click
    lsw.AddSingleLine(txtordine.Text)
End Sub
qualcuno che mi da una manina?
 

ivanomonti

Expert
Licensed User
Longtime User
hai provatato a fare prima il bottone e poi aggiungerlo come object

lsw.item.add(btnaggiungi)!

si leggo ora :)
 

ivanomonti

Expert
Licensed User
Longtime User
comunque credo che per rimuoverlo la textfield la devi dichiarare sul frammento di codice.

B4X:
    'SetDebugAutoFlushLogs(True) 'Uncomment if program crashes before all logs are printed.
    NavControl = Nav
    Page1.Initialize("Page1")
    Page1.Title = "prova 1.0"
    Page1.RootPanel.Color = Colors.RGB (6, 82, 140)
    NavControl.ShowPage(Page1)
    lsw.Initialize("lsw",False)
    btnaggiungi.Initialize("btnaggiungi",btnaggiungi.STYLE_SYSTEM)
    btnaggiungi.Text = "AGGIUNGI"
    btnaggiungi.SetBorder(2,Colors.Black,8)
    btnaggiungi.SetShadow(Colors.Black,3,3,1,True)
    btnaggiungi.Color=Colors.LightGray
    dim txtordine as Textfield
txtordine.Initialize("txtordine")
txtordine.id = "abc" 
    Page1.RootPanel.AddView(txtordine, 3%x,1%y,70%x,9%y)
    Page1.RootPanel.AddView(btnaggiungi, 73%x,1%y,26%x,10%y)
    Page1.RootPanel.AddView(lsw,3%y,11%y,95%x,50%y)
 

LucaMs

Expert
Licensed User
Longtime User
Premesso che, appunto, non ho B4i e tantomeno roba Apple... e che ho un sonno boia...

Nel primo post parli di B4A e una ListView. Con B4i di TableView. Ora, non so a quale TableView tu ti riferisca ma esiste la B4XTableView che "gira" su entrambe le piattaforme (e su B4J) senza dover modificare i comandi per gestirla. Soprattutto, però, mi pare che a te non serva una TableView, ma una ListView, per cui al posto tuo userei una B4XCustomListView, sia perché una TableView è fatta più per dati tabellari, sia perché anche questa gira su B4A, B4J E B4i.
 

ivanomonti

Expert
Licensed User
Longtime User
questo scritto ora e funziona su b4j ma credo che il concetto sia sempre lo stesso

codice scritto su b4j:
#Region Project Attributes
    #MainFormWidth: 600
    #MainFormHeight: 600
#End Region

Sub Process_Globals
    Private fx As JFX
    Private MainForm As Form
    Private Button1 As Button
    Private Button2 As Button
    Private TableView1 As TableView
    Private TextField1 As TextField
    Private ListView1 As ListView
End Sub

Sub AppStart (Form1 As Form, Args() As String)
    MainForm = Form1
    MainForm.RootPane.LoadLayout("layout2") 'Load the layout file.
    MainForm.Show
    TableView1.SetColumns(Array As String("Column 1", "Column 2"))
End Sub

'Return true to allow the default exceptions handler to handle the uncaught exception.
Sub Application_Error (Error As Exception, StackTrace As String) As Boolean
    Return True
End Sub

Sub Button2_Click
    
    For i=0 To TableView1.Items.Size-1
        Log(TableView1.Items.Get(i))
        Dim row() As Object = TableView1.Items.Get(i)
        If row(0) Is TextField Then
                Dim tf As TextField = row(0)
                If tf.Tag = TextField1.Text Then
                    TableView1.Items.RemoveAt(i)
                    Return
                End If
        End If
    Next
    
End Sub

Sub Button1_Click
    Dim tf As TextField
    tf.Initialize(TextField1.Text)
    tf.Text = TextField1.Text
    tf.tag=tf.Text
    Dim Row() As Object = Array (tf, tf.Text)
    Try
        TableView1.Items.Add(Row)
    Catch
        Log(LastException)
    End Try
End Sub
 

Attachments

  • TbleView.zip
    36.4 KB · Views: 185

Star-Dust

Expert
Licensed User
Longtime User
Premesso che, appunto, non ho B4i e tantomeno roba Apple... e che ho un sonno boia...

Nel primo post parli di B4A e una ListView. Con B4i di TableView. Ora, non so a quale TableView tu ti riferisca ma esiste la B4XTableView che "gira" su entrambe le piattaforme (e su B4J) senza dover modificare i comandi per gestirla. Soprattutto, però, mi pare che a te non serva una TableView, ma una ListView, per cui al posto tuo userei una B4XCustomListView, sia perché una TableView è fatta più per dati tabellari, sia perché anche questa gira su B4A, B4J E B4i.
La questione che in iOs esiste TableView e non ListView. Mentre in Android esiste LisView ma non una TableView (o GridView come in B4J).

Erel non ha fatto un Wrap diTableView (a singola colonna) chiamandola ListView e rendendo uniformi i tre IDE. Quindi se non usi XUI (xCustomListView) non puoi riutilizzare il codice di ListView che usi per Android.

Anche se penso che avrebbe dovuto farlo, visto che i tre ambienti ide promettono di avere un codice quasi del tutto trasportabile, almeno le viste Basilari dovevano trovarsi in tutti e tre e con metodi uguali... Alla fine sono dei WRAP li puoi fare come vuoi.

Per esempio la Label esiste in tutti e tre con parametri simili.
EditText inveceli ha chiamati TextView in B4i e B4J. In realtà in Adroid (Java) la vista nativa si chiama TextView e poteva tenere lo stesso nome su tutte e tre gli ambienti..... come ha fatto per il Label (Che in Android è sempre una TextView ma con la tastiera disabilitata)
Non capisco queste discrepanze.... o melgio capisco che in B4A ha usato EditText per renderlo simile al Basic.... e a sto punto poteva fare lo stesso sugli altri
 

ivanomonti

Expert
Licensed User
Longtime User
Per esempio la Label esiste in tutti e tre con parametri simili.
EditText inveceli ha chiamati TextView in B4i e B4J. In realtà in Adroid (Java) la vista nativa si chiama TextView e poteva tenere lo stesso nome su tutte e tre gli ambienti..... come ha fatto per il Label (Che in Android è sempre una TextView ma con la tastiera disabilitata)
Non capisco queste discrepanze.... o melgio capisco che in B4A ha usato EditText per renderlo simile al Basic.... e a sto punto poteva fare lo stesso sugli altri

Concordo con te su questo, ci sono delle discrepanze in molte cose ed in altre eccellenza,,, mai capito come quando crei interfacia su design non esiste la voce elimina oggetto e per anni ho sempre usato taglia per eliminare un oggetto che non serviva poi scopro che con il bottone "Canc" lo elimina, ma mi comporta usare le mani invece di continuare con il mouse e tasto dx come faccio con "Taglia",,, mi sono sempre chiesto perchè questa mancanza?
 

fifiddu70

Well-Known Member
Licensed User
Longtime User
comunque ho risolto il problema in questo modo,
un pusalnte per inserire ed uno per rimuovere il singolo elemento:
B4X:
Sub btnaggiungi_Click
    Dim items As List = TableView1.GetItems(0)
    Dim tc As TableCell 'create a new item
    tc.InitializeSingleLine(txtordine.Text)
    items.InsertAt(0, tc)
    TableView1.ReloadSection(0)
    txtordine.Text=""
  
  
End Sub

Sub TableView1_SelectedChanged (SectionIndex As Int, Cell As TableCell)
    Dim items As List = TableView1.GetItems(0)
    TableView1.ReloadSection(0)
    items.RemoveAt(0)
End Sub

grazie lo stesso dell'aiuto, Grazie ragazzi, Grazie Ivano ma sopratutto grazie anche a Conte.
 

LucaMs

Expert
Licensed User
Longtime User
Non capisco queste discrepanze.... o melgio capisco che in B4A ha usato EditText per renderlo simile al Basic.... e a sto punto poteva fare lo stesso sugli altri
Dipenderà anche dalla cronologia, ovvero dalle date di nascita dei vari strumenti.
Se non sbaglio, all'inizio fu basic4ppc e non credo si pensasse (anzi, non esisteva proprio) ad iOS.
Poi B4A e solo in seguito B4I.

Come hai scritto tu stesso:
Quindi se non usi XUI (xCustomListView)
Usando XUI, abituandoci, sarà tutto più facile. Per iOS, Android, PC, Linux like (B4J) se ti serve un'unica colonna (ma volendo anche più d'una) usi xCustomListView ed hai risolto.
 

Star-Dust

Expert
Licensed User
Longtime User
Dipenderà anche dalla cronologia, ovvero dalle date di nascita dei vari strumenti.
Se non sbaglio, all'inizio fu basic4ppc e non credo si pensasse (anzi, non esisteva proprio) ad iOS.
Poi B4A e solo in seguito B4I.

Come hai scritto tu stesso:

Usando XUI, abituandoci, sarà tutto più facile. Per iOS, Android, PC, Linux like (B4J) se ti serve un'unica colonna (ma volendo anche più d'una) usi xCustomListView ed hai risolto.
Solo che a me XCustomView non piace (o meglio la considero lassativa) e quindi mi sono creato una mia ListView mulpipiattaforma (B4X) ma non XUI. Una specie di Wrap ... ma che wrap non lo è perchè il CustmDesign non produce wrap ma Viste a se.
 
Last edited:

LucaMs

Expert
Licensed User
Longtime User
Solo che a m XCustomView non piace (o meglio la considero lassativa) e quindi mi sono creato una mia ListView mulpipiattaforma (B4X) ma non XUI. Una specie di Wrap ... ma che wrap non lo è perchè il CustmDesign non produce wrap ma Viste a se.
(considera che ho passato la notte in bianco, eh...)

Cos'ha xCustomListView che non ti piace? Volendo ha un metodo AddTextItem, che la rende comoda anche per liste semplici.
Effettivamente anch'io ho creato una mia versione (che però non uso più e poi spiegherò il motivo), perché avrei voluto avere altri metodi/proprietà, ma non vedo grandi difetti; inoltre è appunto multipiattaforma e ne esistono "versioni" particolari, come quella "lazy loading" (sono praticamente dei wrapper dell'originale xCustomListView).

Oh, poi... ma avete provato gli esempi di XUI2D? Io vado pazzo per "Walking character", provato su b4j e b4a!
 

fifiddu70

Well-Known Member
Licensed User
Longtime User
Lucams non so come integrarla sul progetto questa benedetta customlistview.
 
Top