Android Question How to change a certain value in a list containing "Type elements"?

Andie

Member
Licensed User
Longtime User
I have the feeling I should know this. However, I don't. So here is my question:

I defined a Type person and filled the list person_list with elements based on this structure person:
B4X:
    Type person(name As String, profession As String)
    Dim person_data As person
    
    Dim person_list As List
    
    person_data.name = "Mick"
    person_data.profession = "singer"
    person_list.Add(person_data)
    '
    person_data.name = "Keith"
    person_data.profession = "bass guitarist"
    person_list.Add(person_data)
    '
    person_data.name = "Charlie"
    person_data.profession = "drummer"
    person_list.Add(person_data)
How can I change the profession of Keith from "bass guitarist" to "guitarist"?
 

Daestrum

Expert
Licensed User
Longtime User
B4X:
    Type person(name As String, profession As String)

...
    
    Dim person_list As List
    
    person_list.Initialize
    
    Dim person_data As person
    person_data.Initialize
    person_data.name = "Mick"
    person_data.profession = "singer"
    person_list.Add(person_data)
    '
    Dim person_data As person
    person_data.Initialize
    person_data.name = "Keith"
    person_data.profession = "bass guitarist"
    person_list.Add(person_data)
    '
    Dim person_data As person
    person_data.Initialize
    person_data.name = "Charlie"
    person_data.profession = "drummer"
    person_list.Add(person_data)
    
    Log(person_list)
    
    For Each p As person In person_list
        If p.name = "Keith" Then
            p.profession = "guitarist"
        End If
    Next
    Log(person_list)
 
Upvote 0

Daestrum

Expert
Licensed User
Longtime User
Or cleaner way (using the auto generated sub for the type)
B4X:
    Type person(name As String, profession As String)
...
    Dim person_list As List
  
    person_list.Initialize

    person_list.Add(Createperson("Mick","singer"))
    '
    person_list.Add(Createperson("Keith","bass guitarist"))
    '
    person_list.Add(Createperson("Charlie","drummer"))
  
    Log(person_list) ' before change
  
    For Each p As person In person_list
        If p.name = "Keith" Then
            p.profession = "guitarist"
        End If
    Next
    Log(person_list) ' after change
...


Public Sub Createperson (name As String, profession As String) As person
    Dim t1 As person
    t1.Initialize
    t1.name = name
    t1.profession = profession
    Return t1
End Sub

You could add an Exit after the line p.profession = "guitarist" to save reading any more of the list.
 
Last edited:
Upvote 0

emexes

Expert
Licensed User
Another way of loading the list:

B4X:
Type Person(name As String, profession As String) 
...
Dim InitData() As Object = Array("Mick", "singer", "Keith", "bass guitarist", "Charlie", "drummer")
  
Dim person_list As List
person_list.Initialize
  
For I = 0 To InitData.Length - 2 Step 2
    Dim person_data As Person
    person_data.initialize
    person_data.name = InitData(I + 0)
    person_data.profession = InitData(I + 1)
    person_list.Add(person_data)
Next

Log(person_list)
 
Upvote 0

William Lancee

Well-Known Member
Licensed User
Longtime User
I always like the Type approach.
I would make it a map of types.
B4X:
    Dim person_Map As Map
    person_Map.Initialize
    person_Map.Put("Mick", Createperson("Mick","singer"))
    person_Map.Put("Keith", Createperson("Keith","bass guitarist"))
    person_Map.Put("Charlie", Createperson("Charlie","drummer"))
    
    Log(person_Map.Get("Keith").As(person).profession)    'bass guitarist
    person_Map.Get("Keith").As(person).profession = "guitarist"
    Log(person_Map.Get("Keith").As(person).profession)    'guitarist
 
Upvote 0

William Lancee

Well-Known Member
Licensed User
Longtime User
Putting the map loading in the type creator is better.

B4X:
    Dim persons As Map
    persons.Initialize
    NewPerson(persons, "Mick","singer")
    NewPerson(persons, "Keith","bass guitarist")
    NewPerson(persons, "Charlie","drummer")
    
    Log(persons.Get("Keith").As(person).profession)    'bass guitarist
    persons.Get("Keith").As(person).profession = "guitarist"
    Log(persons.Get("Keith").As(person).profession)    'guitarist

B4X:
Public Sub NewPerson (db As Map, name As String, profession As String) As person
    Dim t1 As person
    t1.Initialize
    t1.name = name
    t1.profession = profession
    db.Put(name, t1)
    Return t1
End Sub
 
Upvote 0

LucaMs

Expert
Licensed User
Longtime User
If you only have two fields, KeyValueStore comes in handy.
B4X:
Dim KVS As KeyValueStore
KVS.Initialize("...", "...")
'Fill KVS here

'Change (overwrite)
Dim IndexOf As Int
IndexOf = KVS.ListKeys.IndexOf("Keith")
KVS.Put(IndexOf, "guitarist")

'Horrible version:
B4X:
'Change (overwrite)
KVS.Put(KVS.ListKeys.IndexOf("Keith"), "guitarist")

If there are more than two fields, it is better to use a DB (SQLite).
 
Last edited:
Upvote 0
Top