German CustomListview Hilfe

oliver1983

Member
Licensed User
Longtime User
Hi,

ich hätte gerne genau so eine Listview wie in der Standart Kalender App siehe Screenshot!
Das grund gerüst kenn ich schon! Mir geht es vor allem um die Scrollfunktion das das Datum oben erst verschwindet bzw. mitscrollt wenn ein neuer Tag ist.

Ich hoffe ihr könnt mir folgen

Gruß Olli
 

Attachments

  • Screenshot_2014-09-24-15-25-17.png
    96.7 KB · Views: 328

oliver1983

Member
Licensed User
Longtime User
Ich beschreibe es mal anhand des Screenshots:
oben steht "18. Oktober Samstag", dies bleibt beim scrollen solange oben stehen bis man so weit in der Liste runter Scrollt, das der Termin am 18. Oktober, den man noch leicht erkennen kann, verschwindet. Scrollt man nun weiter, wird oben "21. Oktober Dienstag" stehen, so lange bis man bei "24. Oktober Freitag" angekommen ist.

Zur not mache ich ein Video
 

oliver1983

Member
Licensed User
Longtime User
So ich hab da mal was gemacht, nur wie bekomme ich nun raus wo sicher der Eintrag mit der überschrift befindet das der stehen bleibt?
 

Attachments

  • customscroll.zip
    12.1 KB · Views: 191

klaus

Expert
Licensed User
Longtime User
Mit der standard Version der CustomListView geht es nicht, die hat keine Funktion welche den obersten Eintrag zurück gibt oder zu mindest die ScrollPosition zurück gibt.
Ich sehe diese Möglichkeiten:
- In dem CustomListView Code das ScrollView.ScrollPosition Event hinzufügen welche den Wert an eine Routine im Hauptprogramm übergibt.
Mit dem ScrollPosition Wert kannst Du den Index des oberten Eintrags rechen oder die Koordinaten der Einträge speichern falls die Höhen der Einträge unterschiedlich sind.

- Mit einer standard ScrollView arbeiten, und den obersten Eintrag mit der ScrollPosition rechnen oder die Koordinaten speichern.

Ich habe erst ein bisschen mit dem Programm 'spielen' müssen den auf meinem Smartphone sah Ich nur das Bild unten.
Hab dann auf meinem Tablett weiter gespiel.

Wie definierst Du den Eintrag der oben stehen bleiben soll ?
Dazu brauchst Du eine separate Anzeige.

Pass auf, in der drawBG Routine erstellst Du bei jedem Click eine neue Bitmap, das kann mit der Zeit viel Speicherplatz vergeuden.
B4X:
Dim bpbg As Bitmap
bpbg.Initialize(File.DirAssets, fname)
Die Bitmaps solltest Du in Global definieren.

Ich denke Du könntest auch ohne der drawBG Routine das weisse Dreieck zu zeigen.
Erstelle eine Bitmap mit dem Dreieck mit der Panelhintergrundfarbe und der Rest darum transparent.
Wenn der Panelhintergrund normal ist sieht man das Dreieck nicht, gleiche Farbe.
Wenn der Panelhintergrund geändert wird sieht man es.

Ich würde aber für das ganze eine CustomView Class erstellen.
 

oliver1983

Member
Licensed User
Longtime User
Hi,

drawBG benutze ich für den schattierten rand rechts, das Dreieck gebe ich so an das imageview weiter!
Ja an die ScrollPosition habe ich auch schon gedacht, bin da aber nicht weiter gekommen wie ich die deklarieren soll!

das ist auch eine gute idee mit dem Dreieck
 

klaus

Expert
Licensed User
Longtime User
Im CustomListView Code dieses Event einfügen.
B4X:
Private Sub sv_ScrollChanged(Position As Int)
    If SubExists(CallBack, EventName & "_ScrollChanged") Then
        CallSub2(CallBack, EventName & "_ScrollChanged", Position)
    End If
End Sub

Und im Hauptprogramm:
B4X:
Sub clv3_ScrollChanged(Position As Int)
    Log(Position)
End Sub
Aber wie schon gesagt, Ich würde eine CustomView Class erstellen die Alles beinhaltet.
 

oliver1983

Member
Licensed User
Longtime User
Danke werde ich heute abend ausprobieren, ja das wollte ich auch aber erstmal zum testen
 

oliver1983

Member
Licensed User
Longtime User
so es hat geklappt, nun wie kann ich es machen das das panel auch da bleibt, hat jemand eine idee? hab schon überlegt ob ich ein panel darüber lege und es halt ob stoppt wenn man weiter scrollt

Edit: Kann man ein Panel duplizieren?

Edit2: Oder kann man ein panel aus der Scrollliste "lösen", damit es stehen bleibt?
 
Last edited:

klaus

Expert
Licensed User
Longtime User
Du musst ein separates Panel hinzu fügen mit den gleichen Views wie die Panels in der ScrollView.
Dann kannst Du den Inhalt ändern je nachdem was Du anzeigen willst.
Edit: Kann man ein Panel duplizieren?
Im Designer ja, im Code musst Du es erstellen.
Edit2: Oder kann man ein panel aus der Scrollliste "lösen", damit es stehen bleibt?
Nein.
 

oliver1983

Member
Licensed User
Longtime User
Ich steh grad aufen Schlauch, wie ermittel ich das Panel welches oben steht,
Mit dem ScrollPosition Wert kannst Du den Index des oberten Eintrags rechen oder die Koordinaten der Einträge speichern falls die Höhen der Einträge unterschiedlich sind.
komme dabei nicht weiter. Im Prinzip muss ich doch:

Alle Panels in einer Schleife durchlaufen, in der Schleife die Höhe addieren, dann vergleichen ob die addierte Höhe mit der Scrollposition übereinstimmt, richtig?

Gruß
 

oliver1983

Member
Licensed User
Longtime User
Hab es:


B4X:
Private Sub sv_ScrollChanged(Position As Int)
    If SubExists(CallBack, EventName & "_ScrollChanged") Then
        CallSub2(CallBack, EventName & "_ScrollChanged", Position)
       
        Dim top As Int
        Dim p As Panel
        Dim ia As Int
       
        Dim abheight As Int
       
        'abheight = sv.Height
        abheight = Position
        'Log(abheight)
       
        For i = 0 To items.Size
            p = panels.Get(i)
            If ia < abheight OR ia+p.Height+dividerHeight < abheight Then
                ia = ia + p.Height + dividerHeight
               
            Else
                Exit
            End If
        Next
        Log(i)
    End If
End Sub
 

oliver1983

Member
Licensed User
Longtime User
Nun stehe ich aber vor dem nächsten Problem wie kann ich ein Panel bei der initializierung erstellen?

B4X:
Public Sub Initialize (vCallback As Object, vEventName As String)
    sv.Initialize2(0, "sv")
    items.Initialize
    panels.Initialize
    toppanel.Initialize("toppanel")
    dividerHeight = 2dip
    EventName = vEventName
    CallBack = vCallback
    sv.Color = 0xFFD9D7DE 'this sets the dividers color
    Dim r As Reflector
    Dim idPressed As Int
       idPressed = r.GetStaticField("android.R$drawable", "list_selector_background")
    r.Target = r.GetContext
    r.Target = r.RunMethod("getResources")
    pressedDrawable = r.RunMethod2("getDrawable", idPressed, "java.lang.int")
    DefaultTextColor = Colors.White
    DefaultTextSize = 16
    DefaultTextBackgroundColor = Colors.Black
    DefaultTextBackground = Null
    toppanel.Left = sv.Left
    toppanel.Width = sv.Width
    toppanel.Top = sv.Top
    toppanel.Height = 25dip
   
    toppanel.Color = Colors.White
    toppanel.BringToFront
End Sub

so funktioniert das nicht
 

oliver1983

Member
Licensed User
Longtime User
Jeppi, habe es hinbekommen, ist schon richtig cool, jetzt muss ich nur noch ein paar feinheiten machen.

Anbei der Aktuelle Stand
 

Attachments

  • customscroll.zip
    12.6 KB · Views: 199
Cookies are required to use this site. You must accept them to continue using the site. Learn more…