German xCustomListView Für B4A und B4J - Problem mit "Pane" + "Panel"

JOTHA

Well-Known Member
Licensed User
Longtime User
Die Sub für B4A funktioniert so:
B4A:
Sub CreateListItemB4A(Text As String, Width As Int, Height As Int) As Panel

... und für B4J:
B4J:
Sub CreateListItemB4J(Text As String, Width As Int, Height As Int) As Pane

... aber wenn ich für beide Platformen den Sourcecode verwenden möchte, kommt natürlich eine Fehlermeldung, weil es in B4A die "Pane" nicht gibt und in B4J das "Panel" nicht gibt.

Damit kann man das Problem auch nicht lösen:
B4X:
#if B4A
#else if B4J
#end if

Kennt jemand eine Lösung?
 

JOTHA

Well-Known Member
Licensed User
Longtime User
Hallo Filippo,
lange nichts mehr gehört ... erstmal "gutes neues" ...

Nein mit B4xView habe ich noch nichts gemacht, ich habe das Ganze in B4XPages mit CustomView/CustomListView erstellt.
 

klaus

Expert
Licensed User
Longtime User
Was ist der Inhalt von:
Sub CreateListItemB4A(Text As String, Width As Int, Height As Int) As Panel ?
Ich nehme an dass Du da irgendwo ein Dim pnl As Panel / Pane hast.
Und dass Du das dann mit Return pnl zurück gibst.

Versuche mit der xui Library:
CreateListItemB4A(Text As String, Width As Int, Height As Int) As B4XView
Und dann
Dim pnl As B4XView = xui.CreatePanel(EventName)

Return pnl
 

b4x-de

Active Member
Licensed User
Longtime User
Hallo,

ich verstehe das Problem vielleicht noch nicht richtig. Aber warum funktioniert das so nicht?

B4X:
#If b4j
    Sub CreateListItem(Text As String, Width As Int, Height As Int) As Pane
#Else If b4a
    Sub CreateListItem(Text As String, Width As Int, Height As Int) As Panel
#End If

' Do something

End Sub

Sub test()
    ' Deklaration
#if b4j
    Dim pnl As Pane
#Else if b4a
 Dim pnl As Panel
#End If

    pnl = CreateListItem("Test", 300, 300)
End Sub

Wenn die beiden Operationen unbedingt unterschiedlich heißen müssen, dann könnte es auch so gehen:

B4X:
#If b4j
    Sub CreateListItemB4j(Text As String, Width As Int, Height As Int) As Pane
    ' Do something B4j
    End Sub
#Else If b4a
    Sub CreateListItemB4a(Text As String, Width As Int, Height As Int) As Panel
    ' Do something B4a
    End Sub
#End If

Sub CreateListItem(Text As String, Width As Int, Height As Int) As B4XView
    #if b4j
        Return CreateListItemB4j(Text, Width, Height)
    #else if b4a
        Return CreateListItemB4a(Text, Width, Height)
    #End If
    
End Sub

Sub test()
    ' Deklaration
#if b4j
    Dim pnl As Pane
#Else if b4a
 Dim pnl As Panel
#End If

    pnl = CreateListItem("Test", 300, 300)
End Sub

Falls ich falsch liege, erkläre bitte noch einmal das Problem. Danke!

Viele Grüße,
Thomas
 

klaus

Expert
Licensed User
Longtime User
Beiliegend ein kleines B4XPages Demoprojekt mit einer xCustomListView und mit B4XViews anstatt Panel und Pane.
Funktioniert in allen drei Plattformen.
Unten, der B4J B4XMainPage Code.
Sub FillCustomListView und Sub CreateItem sind genau gleich in allen Plattformen.

B4X:
'This event will be called once, before the page becomes visible.
Private Sub B4XPage_Created (Root1 As B4XView)
    Root = Root1
    Root.LoadLayout("MainPage")
   
    FillCustomListView
End Sub

'You can see the list of page related events in the B4XPagesManager object. The event name is B4XPage.

Private Sub FillCustomListView
    Private i As Int
  
    For i = 0 To 20
        CustomListView1.Add(CreateItem(i, CustomListView1.AsView.Width, 60dip), i)
    Next
End Sub

Private Sub CreateItem(i As Int, Width As Int, Height As Int) As B4XView
    Private pnl As B4XView
  
    pnl = xui.CreatePanel("")
    pnl.SetLayoutAnimated(0, 0, 0, Width, Height - 2dip)
    pnl.Color = xui.Color_Blue
    pnl.LoadLayout("Item")
    Label1.Text = "Test " & i
    Button1.Text = "Click " & i
  
    Return pnl
End Sub
 

Attachments

  • CustomListViewDemo.zip
    18.5 KB · Views: 202
Last edited:

JOTHA

Well-Known Member
Licensed User
Longtime User
Hallo Thomas, hallo Klaus,
@thomas: Vielen Dank für deinen Lösungsvorschlag und deine Mühe (evtl. könnte das auch funktionieren).

Ich habe jetzt allerdings gleich das Demoprojekt von Klaus ausprobiert und es läuft SUUUPER :) !
Vielen lieben Dank Klaus!

Noch eine Frage am Rande:
Müssen immer 2 Layouts für die xCLV angelegt werden, oder geht das auch innerhalb eines einzelnen Layouts?

P.S.: Leider habe ich nur Abends Zeit, deshalb die späte Rückmeldung ...
 

klaus

Expert
Licensed User
Longtime User
Müssen immer 2 Layouts für die xCLV angelegt werden, oder geht das auch innerhalb eines einzelnen Layouts?
Ja, Du brauchst eine Layout Datei in der sich die xCLV befindet und mindestens eine Layout Datei für die Einträge.
Man kann in xCLV mehrere verschiedene Einträge einfügen und dafür braucht man eine Layout Datei pro verschiedener Eintrag.
 

JOTHA

Well-Known Member
Licensed User
Longtime User
Man kann in xCLV mehrere verschiedene Einträge einfügen und dafür braucht man eine Layout Datei pro verschiedener Eintrag.
Kann man auf immer die gleiche xCLV auch mehrere verschiedene Einträge einfügen, indem man die xCLV leert (mit .clear) und dann wieder mit neuen Einträgen füllt?

Ich probiere das nacher gleich mal aus ... Ich habe diese Frage nur mal öffentlich reingestellt, vielleicht interessiert das ja auch andere ... ;)
 
Top