German Spinner(Kombobox) mit mehreren Feldern

ykucuk

Well-Known Member
Licensed User
Longtime User
Hallo,

ich arbeite gerade an den letzten Funktionen meiner Anwendung.
Ich suche eine Möglichkeit einer Kombobox in denen ich mehrere Felder einfügen kann, Spinner ist ja eine Art Kombobox die ich manuell befüllen kann.

Ich möchte gerne einen Spinner befüllen, die Daten kommen dabei aus einer Online Datenbank. Nun den Spinner möchte ich mit mehreren Felden aus der Tabelle befüllen.
Als Beispiel:
- ID
- Name
- Preis

Wenn ich nun den Spinner anklicke, sollte es wie folgt aussehen:

ID | Name | Preis

Wenn ich jetzt etwas anklicke möchte ich mehrere Variablen befüllen und damit dann wieder eine Datenbankanfrage ausführen.

Ich wäre echt dankbar, wenn mir mal einer helfen könnte diese Art von Kombobox zu realisieren, beziehungsweise gibt es diesbezüglich schon eine Lösung.

Danke schonmal im Voraus
 

DonManfred

Expert
Licensed User
Longtime User
Nein, ein Android Spinner hat nur "eine Spalte".
ABER Du kannst Dir eine Brücke schaffen.

Lege Dir eine List an
B4X:
dim lc as list
lc.initialize
und beim befüllen des Spinners legst du für jeden Spinnereintrag eine Map mit den benötigten Daten an
B4X:
dim m as map
m.initialize
m.put("id",123)
m.put("spinner","spinneritem")
m.put("valuex","weiterer wert")
Nun fügst du diese Map der list hinzu
B4X:
lv.add(m)

Wird nun ein spinnereintrag gewählt, dann holst Du Dir aus der list die map von dem spinner und hast DA dann die daten drin die Du anderswo befüllen willst.
Wenn du diese Maps in der gleichen Reihenfolge anlegst und in die list packst wie Du den spinner befüllst dann sollte
B4X:
dim m as map = lc.get(selectedindex)
dir ja die map liefern, die Du mit diesem spinneritem verknüpft hast.

sowas in der Art... habe das jetzt alles frei ausm gedächtnis geschrieben. Sollte vom Prinzip aber funktionieren.

Fehler in meinen Ausführungen möge man mir verzeihen. Mein Kaffee-Pegel liegt heute noch bei 0. :D
 

ykucuk

Well-Known Member
Licensed User
Longtime User
Super, so werde ich das dann machen
Danke für die Info
Wird jetzt ein wenig aufwendig, habe in diesem Formular 6 Spinner drin :)
 

DonManfred

Expert
Licensed User
Longtime User
Wird jetzt ein wenig aufwendig, habe in diesem Formular 6 Spinner drin
Ist das nun mein Problem? :D

Nee, im Ernst... wenn du ein wenig drüber nachdenkst dann findest Du bestimmt eine elegante Lösung.

Du könntest Di EINE sub schreiben die als Parameter den spinner, die liste der items und einen namen (1-6) übergeben bekommt....
Na, macht´s Klick?
 

ykucuk

Well-Known Member
Licensed User
Longtime User
na klar, das werde ich bestimmt und nein es ist mein Problem :)
Ich überlege gerade die ganze Sache mit den Spinnern wegzulassen, ich muss heute mit der ersten Beta fertig werden und es zum testen übergeben.
Die Windows Version ist ja schon fertig, fehlt nur noch dieser und die anderen mobilen Plattformen
 

DonManfred

Expert
Licensed User
Longtime User
gaanz grobes Beispiel... hier werden bisher allerdings nur zwei der 6 spinner verwendet
B4X:
Sub Globals
    'These global variables will be redeclared each time the activity is created.
    'These variables can only be accessed from this module.
    Dim db As SQL   
    Dim CurrentIndex = -1 As Int        ' index of the current entry
    Dim RowNumber,Row = 0 As Int                ' number of rows
    Dim NorthwindDB As String = "Northwind.sqlite"
    Private Spinner1 As Spinner
    Private Spinner2 As Spinner
    Private Spinner3 As Spinner
    Private Spinner4 As Spinner
    Private Spinner5 As Spinner
    Private Spinner6 As Spinner
    Dim lc1,lc2,lc3,lc4,lc5,lc6 As List
End Sub

Sub Activity_Create(FirstTime As Boolean)
    'Do not forget to load the layout file created with the visual designer. For example:
  If FirstTime Then
    'manager.Initialize("8bgblt25ldqwh70", "pdiny9ijcwgs8kr", "manager", True)  ' B4ADrop
        Dim dbpath As String = DBUtils.CopyDBFromAssets(NorthwindDB)
        db.Initialize (dbpath, NorthwindDB, False)
    End If
    lc1.Initialize
    lc2.Initialize
    lc3.Initialize
    lc4.Initialize
    lc5.Initialize
    lc6.Initialize
    'ReadDataBase
    Activity.LoadLayout("main")
    'Dim retmap As Map
    'retmap.Initialize
    'retmap.Put("dsid","")
    'retmap.Put("handle","")
    'retmap.Put("rev",0)
End Sub
Sub CheckNull(str As String) As String
    If str = Null Then
        Return ""
    Else
        Return str
    End If
End Sub
Sub Activity_Pause (UserClosed As Boolean)
End Sub
Sub Activity_Resume
    fillspinner(Spinner1,1)
    fillspinner(Spinner2,2)
End Sub
Sub fillspinner(sp As Spinner,typ As Int)
    'We read only the ID column and put them in a List
    sp.Clear
    Dim table As String = ""
    Dim feldname As String = ""
    Select typ
    Case 1
      Log("1 - customers")
            lc1.Clear
            table = "Customers"
            feldname = "CompanyName"
    Case 2
            lc2.Clear
      Log("2 - Categories")
            table = "Categories"
            feldname = "CategoryName"
    Case 3
            lc3.Clear
      Log("3 - ")
    Case 4
            lc4.Clear
      Log("4 - ")
    Case 5
            lc5.Clear
      Log("5 - ")
    Case 6
            lc6.Clear
      Log("6 - ")
    End Select
   
    Dim cur As Cursor
    cur = db.ExecQuery("SELECT * FROM "&table)
    If cur.RowCount > 0 Then                        'check if entries exist
        RowNumber = cur.RowCount                    'set the row count variable
        For Row = 0 To cur.RowCount - 1
            cur.Position = Row                            'set the Cursor to each row
            Dim m As Map
            m.Initialize
            For i = 0 To cur.ColumnCount-1
                If cur.GetColumnName(i) = "Picture" Then
                    Log(cur.GetColumnName(i)&"=BLOB")
                    Dim BlobBuffer() As Byte
                    BlobBuffer = cur.GetBlob("Picture")
                    m.Put(cur.GetColumnName(i),BlobBuffer)
                Else
                    Log(cur.GetColumnName(i)&"="&cur.GetString(cur.GetColumnName(i)))
                    If cur.GetString(cur.GetColumnName(i)) = Null Then
                        m.Put(cur.GetColumnName(i),"")
                    Else
                        m.Put(cur.GetColumnName(i),cur.GetString(cur.GetColumnName(i)))
                    End If
                End If
            Next
            Select typ
            Case 1
                    lc1.Add(m)
            Case 2
                    lc2.Add(m)
            Case 3
                    lc3.Add(m)
            Case 4
                    lc4.Add(m)
            Case 5
                    lc5.Add(m)
            Case 6
                    lc6.Add(m)
            End Select

            sp.Add(cur.GetString(feldname))
            Log(cur.GetString(feldname))
        Next
        CurrentIndex = 0                                            'set the current index to 0
    End If
    cur.Close                                                        'close the cursor, we don't need it anymore
End Sub

Sub Spinner_ItemClick (Position As Int, Value As Object)
    Log("Spinner_ItemClick("&Position&")")
    Dim sp As Spinner = Sender
    Log("spinner.tag="&sp.Tag)
    If sp.Tag = "1" Then
        Dim lc As List = lc1
        Log("lc.size="&lc.Size)
        Dim m As Map = lc.Get(Position)
        Log(m)
    End If
    If sp.Tag = "2" Then
        Dim lc As List = lc2
        Dim m As Map = lc.Get(Position)
        Log(m)
    End If
End Sub
 

Attachments

  • spmap.zip
    339.3 KB · Views: 347

DonManfred

Expert
Licensed User
Longtime User
das gleiches nochmal ein bisschen geändert (bei den categories wird nun auch das bild angezeigt)
B4X:
Sub Spinner_ItemClick (Position As Int, Value As Object)
    Log("Spinner_ItemClick("&Position&")")
    Dim sp As Spinner = Sender
    Log("spinner.tag="&sp.Tag)
    If sp.Tag = "1" Then
        Dim lc As List = lc1
        Log("lc.size="&lc.Size)
        Dim m As Map = lc.Get(Position)
        Log(m)
    End If
    If sp.Tag = "2" Then
        Dim lc As List = lc2
        Dim m As Map = lc.Get(Position)
        Log(m)

        Dim bmp As Bitmap
        Dim In1 As InputStream
        Dim buffer() As Byte           
        buffer = m.Get("Picture")
        In1.InitializeFromBytesArray(buffer,0,buffer.Length)
        bmp.Initialize2(In1)           
        img2.Bitmap = bmp       
    End If
End Sub
 

Attachments

  • spmap2mitbild.zip
    339.5 KB · Views: 313

ykucuk

Well-Known Member
Licensed User
Longtime User
DonManfred, du scheinst ein Profi zu sein, deshalb möchte ich nun doch nochmal was fragen

Ich habe jetzt eine andere Idee das ganze umzusetzen. Das ganze will ich in einer ScrollView speichern.
Ich habe jetzt ein neues Layout erstellt mit dem Scrollview und beim betätigen des Buttons kommt jetzt die View die ich erstellt habe mit den ScrollView.
Wie kann ich jetzt diese Scrollview mit Daten befüllen von der Activity von der ich es starte.

Kannst du mir ein Ansatz dafür nennen?
 
Top