German Problem mit Listview

jsk001

Member
Licensed User
Longtime User
Ich verwende in einem funktionierenden Projekt ein Listview um den
Inhalt einer Textdatei mit etwa 200 Fahrzeugen (Bezeichnung des Fahrzeuges und Rufnummer)
anzuzeigen (TwoLinesLayout) und bei Auswahl bestimmte Aktionen auszuführen.
ich möchte jetzt von einer anderen Activity aus bestimmte Fahrzeuge editieren, Löschen
oder ein neues Fahrzeug zum Listview hinzufügen.
Leider bekomme ich das einfach nicht gebacken. Wenn ich mit folgendem Code versuche ein Fahrzeug hinzuzufügen, wird weder der Eintrag angezeigt, noch wird der Sprung zum letzten Fahrzeug ausgeführt.
Ich hoffe, daß mir hier jemand einen Tip geben kann.
Ich möchte das Ganze gern mit einem Listview auf die Reihe kriegen, da das Programm ziemlich komplex ist und ich nicht das ganze Projekt "umstricken" möchte.

Hier der Auschnitt aus dem Code in der zweiten Activity (EditCars):

Main.PhoneList.AddTwoLines(CarName.Text,CarNumber.Text) 'zu vorhandenen Entries hinzufügen
SaveCar.SetBackgroundImage(LoadBitmap(File.DirAssets,"save_gray.png"))
Main.PhoneList.SetSelection(Main.PhoneList.size) ' gehe zum letzten eintrag
StartActivity(Main)

Danke für Eure Hilfe im Voraus
 

MaFu

Well-Known Member
Licensed User
Longtime User
Unter Android ist immer nur eine Activity "aktiv". Du kannst also nicht einfach so von Deiner aktuellen Activity Funktionen oder Objekte einer anderen Activity aufrufen.
Von wo und wie werden in der main Activity die Fahrzeuge geladen? Ev. kann man da ansetzen. Schließlich wirst Du ja Deine geänderten/neuen Fahrzeuge ja auch abspeichern.
 

ernschd

Active Member
Licensed User
Longtime User
Wie wäre es, wenn du das ganze umdrehst? Also zuerst die Daten der Fahrzeuge speichern oder löschen (z.B. in einer Sqlite-Datei), und beim Starten der Main-Activity die Liste jedes Mal komplett neu laden. Dann wird sie immer aktuell aufgebaut.
 

jsk001

Member
Licensed User
Longtime User
Wie wäre es, wenn du das ganze umdrehst? Also zuerst die Daten der Fahrzeuge speichern oder löschen (z.B. in einer Sqlite-Datei), und beim Starten der Main-Activity die Liste jedes Mal komplett neu laden. Dann wird sie immer aktuell aufgebaut.
Unter Android ist immer nur eine Activity "aktiv". Du kannst also nicht einfach so von Deiner aktuellen Activity Funktionen oder Objekte einer anderen Activity aufrufen.
Von wo und wie werden in der main Activity die Fahrzeuge geladen? Ev. kann man da ansetzen. Schließlich wirst Du ja Deine geänderten/neuen Fahrzeuge ja auch abspeichern.

Ich lade die Fahrzeugdatei in der Main Activity.

Sub ReadContactList
'-----------use list of cars-------------------------
PhoneList.Visible=True
SearchTxt.Visible=True
Search.Visible=True
BtnNext.Visible=True
'-----------------------------------------------
If File.ExternalWritable = False Then
Msgbox("Cannot access to storage card.", "")
Beep(300,300)
Return
End If

If File.Exists(CheckSDcard.sd, "cars.txt") Then
PhoneList.Clear
Dim ContactsList As List

ContactsList = File.ReadList(CheckSDcard.sd, "cars.txt")

Dim cnt As Int
cnt=ContactsList.Size - 1

Dim trenner As String
For i = 0 To cnt
Dim C,name,number As String
Dim lvd As ListViewData
lvd.Initialize
C = ContactsList.Get(i)
trenner=C.IndexOf(",")
If trenner >-1 Then
number=C.SubString2(trenner+1,C.Length)
name=C.SubString2(0,trenner)
lvd.FirstRow = name
lvd.SecondRow= number
PhoneList.AddTwoLines2(lvd.FirstRow,lvd.SecondRow,lvd)
End If
Next
Beep(300,1000)
ActualPos=0
If PhoneList.Size>-1 Then
PhoneList.SetSelection(0)
End If
Else
Msgbox("cars.txt not found on sdcard","File cars.txt is missing")
End If
End Sub
 

ernschd

Active Member
Licensed User
Longtime User
Deswegen würde ich die Quelle der Daten bearbeiten - somit hast du auch immer einen aktuellen Bestand.
Wenn du nur die Liste veränderst, musst du am Ende die Änderung in die Quelle übernehmen und hast somit 2 Arbeitsschritte.
 

jsk001

Member
Licensed User
Longtime User
Deswegen würde ich die Quelle der Daten bearbeiten - somit hast du auch immer einen aktuellen Bestand.
Wenn du nur die Liste veränderst, musst du am Ende die Änderung in die Quelle übernehmen und hast somit 2 Arbeitsschritte.

Du hast natürlich absolut recht. Mit einer SQL Database währe es die sauberste, aber eben auch
für Beginner nicht die einfachste Lösung.
Was ich nicht verstehe ist, daß bei einem solchen Topsystem wie B4A im Listview so
etwas wir listview1.setitem(i)="..." ...etc. trotz vieler ähnlicher Rückfragen in der Community nicht
implementiert ist. Die Implementierung solte doch wirklich nicht so aufwendig sein.
Ich würde mir das jedenfalls sehr wünschen. Das würde auch für Umsteiger von VB.net die
Sache erheblich vereinfachen (und diese tolle Programmierungebung währe noch etwas perfekter).

LG jsk001
 

ernschd

Active Member
Licensed User
Longtime User
Du könntest es auch so lösen (wobei ich das nicht wirklich elegant finde):

In der Main-Activity eine Methode zum Hinzufügen eines Eintrags schreiben
B4X:
Public Sub add(name As String, number As String)
    ListView1.AddTwoLines(name, number)   
End Sub

Und diese in der EditCars-Activity so aufrufen
B4X:
Sub Button1_Click   
    CallSubDelayed2(Main, "eintrag", "1")
End Sub

Ich glaube auch nicht, dass es was mit B4A zu tun hat, sondern eher mit dem Activity-System von Android.
 

jsk001

Member
Licensed User
Longtime User
für Beginner nicht die einfachste Lösung.
Du könntest es auch so lösen (wobei ich das nicht wirklich elegant finde):

In der Main-Activity eine Methode zum Hinzufügen eines Eintrags schreiben
B4X:
Public Sub add(name As String, number As String)
    ListView1.AddTwoLines(name, number)  
End Sub

Und diese in der EditCars-Activity so aufrufen
B4X:
Sub Button1_Click  
    CallSubDelayed2(Main, "eintrag", "1")
End Sub

Ich glaube auch nicht, dass es was mit B4A zu tun hat, sondern eher mit dem Activity-System von Android.

Danke für die Unterstützung. Ich werde morgen schauen, ob ich das so implementiert bekomme, oder das Ganze
dann doch per SQL realisiere.

LG jsk001
 

klaus

Expert
Licensed User
Longtime User
SQLite ist bei weitem nicht so schwer wie man sich es als Beginner vorstellt.
SQLite zu lernen ist den Aufwand wert.
Du kannst dir die Beispiele in meiner Unterschrift anschauen.
Im User's Guide gibt es ein ganzes Kapitel darüber.
Bevor Ich den User's Guide schrieb hatte Ich keine Ahnung von Datenbanken.
 

MaFu

Well-Known Member
Licensed User
Longtime User
Wo die Daten herkommen (Textdatei oder Datenbank) ist aber prinzipiell wurscht und hat mit Deinem Problem erst mal gar nichts zu tun (auch wenn natürlich eine Datenbank mehr Sinn macht und einiges vereinfacht).
 

jsk001

Member
Licensed User
Longtime User
Wo die Daten herkommen (Textdatei oder Datenbank) ist aber prinzipiell wurscht und hat mit Deinem Problem erst mal gar nichts zu tun (auch wenn natürlich eine Datenbank mehr Sinn macht und einiges vereinfacht).

Hallo Manfred,
Ich bedanke mich auf jeden Fall für Deinen Tip und ich denke, ich werde
mich mal intensiver mit dem Thema SQL beschäftigen. Ich war halt von vb.net
her mit Listviews vertraut und habe deshalb diese in meinem Projekt verwendet,
ohne vorher die Grenzen ausgelotet zu haben. Unter vb.net kann man sehr flexibel damit
arbeiten und deshalb ging meine Frage auch in diese Richtung.
Vieleicht findet sich ja auch jemand von den Spezialisten, der das Listview mal in dieser
Richtung like vb.net etwas aufbohrt. Ich glaube, daß viele von denen, die von vb.net kommen
dafür dankbar sein würden und es ihnen die Arbeit schon vereinfachen würde.
Einträge im Listview zu editieren währe sehr schön.
Auf jeden Fall recht herzlichen Dank für die Mühe (und das Verständnis eurerseits).

LG jsk001
 
Top