Mehrere Text-Spinners auf einen setOnItemSelectedListener arbeiten lassen

  • Antworten:25
mr1000
  • Forum-Beiträge: 86

23.09.2020, 23:49:04 via Website

Guten Abend zusammen,

ich habe folgendes Problem:

Ich lasse mir Edittext-Felder und Text-Spinner generieren,nun benutze ich Singleton um die Werte die ich in die Edittext-Felder eingegeben habe in den anderen Activitys zu verarbeiten.

Nun benutze ich mehrere Text-Spinners die aber alle auf die selbe setOnItemSelectedListener zugreifen.

Dadurch entsteht das Problem, dass alle vorherige Werte gelöscht werden und nur die letzten Wert gespeichert wird.

Wie kann ich es machen,dass die vorherige Werte bestehen bleiben?

                spinner.setId(i);
                ArrayAdapter<String> adapter = new ArrayAdapter<String>(getActivity(), android.R.layout.simple_spinner_item, Metalle);
                adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
                spinner.setAdapter(adapter);



spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {

                @Override
                public void onItemSelected(AdapterView<?> parentView, View selectedItemView, int position, long id) {

                    switch (spinner.getItemAtPosition(position).toString()) {

                        case "Schrott,Stanzabfälle":

                            singleTonClass.setSchrottPreisKg(etPreisKg.getText().toString());
                            singleTonClass.setSchrottGewicht(etGewicht.getText().toString());
                            singleTonClass.setSchrottBetrag(etBetrag.getText().toString());

                            break;

                        case "E-Motore":

                            singleTonClass.setEMotorPreisKg(etPreisKg.getText().toString());
                            singleTonClass.setEMotorGewicht(etGewicht.getText().toString());
                            singleTonClass.setEMotorBetrag(etBetrag.getText().toString());

                            break;

                        case "Sperrschrott":

                            singleTonClass.setSperrPreisKg(etPreisKg.getText().toString());
                            singleTonClass.setSperrGewicht(etGewicht.getText().toString());
                            singleTonClass.setSperrBetrag(etBetrag.getText().toString());


                            break;

gruß,

mr1000

Kommentieren
Jokel
  • Forum-Beiträge: 1.530

24.09.2020, 09:08:46 via Website

Hallo
Wie wäre es wenn du in deiner Singelton Klasse deine Texte in einer Liste hältst als nur in einer einfachen String Variablen.
Du fügst in jedem Listener ein Element der liste hinzu.
Am Ende, wenn du die Daten in das PDF schreibst löschst du die Liste in der Klasse.

Du arbeitest dynamisch mit Spinnern also musst du auch dynamisch weiterarbeiten und nicht mit statischen Variablen.

— geändert am 24.09.2020, 09:32:42

Hilfreich?
Kommentieren
mr1000
  • Forum-Beiträge: 86

24.09.2020, 12:36:39 via App

Hallo Jokel,

hättest du ein Beispiel-Code für mich, da ich mir leider etwas schwer tue.

Edit:

Heißt das, dass ich eine Liste in meiner Singleton-Klasse erstelle und in der Liste schreibe ich, dann die Werte meines Edittext?

Dann mit der getter die Werte zuweisen?

Gruß,

Mr1000

— geändert am 24.09.2020, 16:37:33

Hilfreich?
Kommentieren
Jokel
  • Forum-Beiträge: 1.530

24.09.2020, 15:29:27 via Website

Dann zeige doch mal wie deine Klasse aussieht.

Hilfreich?
Kommentieren
Jokel
  • Forum-Beiträge: 1.530

24.09.2020, 15:31:50 via Website

Du kannst getter und setter nutzen musst du aber auch nicht.

— geändert am 24.09.2020, 16:04:34

Hilfreich?
Kommentieren
mr1000
  • Forum-Beiträge: 86

24.09.2020, 16:36:47 via Website

Hallo Jokel,

 private static final singleTon ourInstance = new singleTon();

static singleTon getInstance() {
    return ourInstance;
}

private singleTon() {}


public String getSchrottPreisKg() {
    return SchrottPreisKg;
}

public void setSchrottPreisKg(String schrottPreisKg) {
    SchrottPreisKg = schrottPreisKg;
}

public String getSchrottGewicht() {
    return SchrottGewicht;
}

public void setSchrottGewicht(String schrottGewicht) {
    SchrottGewicht = schrottGewicht;
}

public String getSchrottBetrag() {
    return SchrottBetrag;
}

public void setSchrottBetrag(String schrottBetrag) {
    SchrottBetrag = schrottBetrag;
}

public String getEMotorPreisKg() {
    return EMotorPreisKg;
}

public void setEMotorPreisKg(String EMotorPreisKg) {
    this.EMotorPreisKg = EMotorPreisKg;
}

public String getEMotorGewicht() {
    return EMotorGewicht;
}

public void setEMotorGewicht(String EMotorGewicht) {
    this.EMotorGewicht = EMotorGewicht;
}

public String getEMotorBetrag() {
    return EMotorBetrag;
}

public void setEMotorBetrag(String EMotorBetrag) {
    this.EMotorBetrag = EMotorBetrag;
}

public String getSperrPreisKg() {
    return SperrPreisKg;
}

public void setSperrPreisKg(String sperrPreisKg) {
    SperrPreisKg = sperrPreisKg;
}

public String getSperrGewicht() {
    return SperrGewicht;
}

public void setSperrGewicht(String sperrGewicht) {
    SperrGewicht = sperrGewicht;
}

public String getSperrBetrag() {
    return SperrBetrag;
}

public void setSperrBetrag(String sperrBetrag) {
    SperrBetrag = sperrBetrag;
}

public String getSchredderPreisKg() {
    return SchredderPreisKg;
}

public void setSchredderPreisKg(String schredderPreisKg) {
    SchredderPreisKg = schredderPreisKg;
}

gruß,
mr1000

Hilfreich?
Kommentieren
Jokel
  • Forum-Beiträge: 1.530

24.09.2020, 16:56:52 via Website

Dachte ich mir doch das du alles nur in einfache String variablen speichern willst.

Wie soll das gehen du weißt ja vorher nicht wie viele Spinner und somit wie viele EditTexte es werden.
Du musst schon ArrayListen benutzen.

ArrayList<String> liste = new ArrayList();

— geändert am 24.09.2020, 18:59:19

Hilfreich?
Kommentieren
mr1000
  • Forum-Beiträge: 86

24.09.2020, 16:59:41 via Website

Wie soll ich das denn machen mit den Listen?

gruß,

mr1000

Hilfreich?
Kommentieren
Jokel
  • Forum-Beiträge: 1.530

24.09.2020, 17:33:08 via Website

In etwa so

Du bekommst mit dem getter die ganze Liste.
Kannst dann mit einer for schleife mittel „get“ durch die Liste gehen und in das PDF speichern.

Doku Arraylist Java Lesen könnte auch helfen.
http://openbook.rheinwerk-verlag.de/javainsel9/javainsel_13_003.htm
https://developer.android.com/reference/java/util/ArrayList

    private static final singleTon ourInstance = new singleTon();

ArrayList<String> schrottPreisKg;


static singleTon getInstance() {
    return ourInstance;
}

private singleTon() {
        schrottPreisKg = new ArrayLis<String>();
}




public ArrayList getSchrottPreisKg() {
    return shrottPreisKg;
}

public String getSchrottPreisKg(int pos) {
    return shrottPreisKg.get(pos);
}

public void setSchrottPreisKg(String st) {
    schrottPreisKg.add(st);
}

public void setSchrottPreisKgClear(){
    schrottPreisKg.clear();

}

und so weiter

— geändert am 24.09.2020, 17:34:09

Hilfreich?
Kommentieren
mr1000
  • Forum-Beiträge: 86

24.09.2020, 20:47:54 via Website

Hallo Jokel,

vielen dank für deine Hilfe.

Ich habe es so umgesetzt, wie du es mir erklärt hast, nur komme ich gerade nicht weiter :(

 ArrayList<String> schrottPreisKg;
ArrayList<String> SchrottGewicht;
ArrayList<String> SchrottBetrag;

private singleTon() {

    schrottPreisKg = new ArrayList<String>();
    SchrottGewicht = new ArrayList<String>();
    SchrottBetrag = new ArrayList<String>();


public ArrayList<String> getSchrottPreisKg() {
    return schrottPreisKg;
}

public String getSchrottPreisKg(int pos) {
    return schrottPreisKg.get(pos);
}

public void setSchrottPreisKg(String st) {
    schrottPreisKg.add(st);
}

public void setSchrottPreisKgDell(){
    schrottPreisKg.clear();

}


public ArrayList<String> getSchrottGewicht(){
    return SchrottGewicht;
}
public String getSchrottGewicht(int pos) {
    return SchrottGewicht.get(pos);
}
public void setSchrottGewicht(String st) {
    SchrottGewicht.add(st);
}

public void setSchrottGewichtKgDell(){
    SchrottGewicht.clear();

}







 case "Schrott,Stanzabfälle":


                            singleTonClass.setSchrottPreisKg(etPreisKg.getText().toString());
                            singleTonClass.setSchrottGewicht(etGewicht.getText().toString());
                            singleTonClass.setSchrottBetrag(etBetrag.getText().toString());


                            break;

Nun habe ich trotzdem das Problem,dass nicht alle Werte übertragen werden.

Ich hoffe du kannst mir helfen

gruß,

mr1000

— geändert am 24.09.2020, 20:49:58

Hilfreich?
Kommentieren
Jokel
  • Forum-Beiträge: 1.530

24.09.2020, 21:55:23 via Website

Wo was genau geht denn nicht solltes du schon genauer beschreiben. Und auch selber untersuchen. Debuggen.

Vor allen werden den auch alle EditText felder der Reihe nach ausgelesen.

Das mußt du schon selber prüfen.

— geändert am 25.09.2020, 08:16:30

Hilfreich?
swa00
Kommentieren
mr1000
  • Forum-Beiträge: 86

26.09.2020, 11:20:12 via Website

Guten Morgen,

Entschuldigung das ich mich nicht mehr gemeldet habe.

Ich versuche die ganze Zeit es hinzubekommen,dass alle Werte die ich in die EditText-Felder auch in die Tabelle geschrieben werden.

Bei mir wird immer nur der letzte Eintrag in die Tabelle geschrieben, die vorherigen Werte werden nicht hineingeschrieben.

Ich habe gedacht ich könnte es so lösen:

 spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {

                @Override
                public void onItemSelected(AdapterView<?> parentView, View selectedItemView, int position, long id) {

                   SelectItem = position;




                }

                @Override
                public void onNothingSelected(AdapterView<?> parentView) {
                    // your code here
                }

            });


 KundenInfobt.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {

                    switch (spinner.getItemAtPosition(SelectItem).toString()) {

                        case "Schrott,Stanzabfälle":


                            singleTonClass.setSchrottPreisKg(etPreisKg.getText().toString());
                            singleTonClass.setSchrottGewicht(etGewicht.getText().toString());
                            singleTonClass.setSchrottBetrag(etBetrag.getText().toString());


                            break;

                        case "E-Motore":

                            singleTonClass.setEMotorPreisKg(etPreisKg.getText().toString());
                            singleTonClass.setEMotorGewicht(etGewicht.getText().toString());
                            singleTonClass.setEMotorBetrag(etBetrag.getText().toString());

                            break;

                        case "Sperrschrott":

                            singleTonClass.setSperrPreisKg(etPreisKg.getText().toString());
                            singleTonClass.setSperrGewicht(etGewicht.getText().toString());
                            singleTonClass.setSperrBetrag(etBetrag.getText().toString());


                            break;

Ich möchte es unbedingt für das Problem eine Lösung finden.

Schönen Tag,

mr1000

Hilfreich?
Kommentieren
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

26.09.2020, 11:55:32 via Website

Mit dem Debugger kannst du nachschauen, was du in deiner Singleton drin hast.
Vermutlich liegt es eher an deiner Verarbeitung in der Tabelle als das die Datenhaltung nicht funktioniert.
Wie erstellst du deine Tabelle mittels deines Siongleton?

LG Pascal //It's not a bug, it's a feature. :) ;)

Hilfreich?
Kommentieren
mr1000
  • Forum-Beiträge: 86

26.09.2020, 12:16:39 via Website

Hallo Pascal,

Die Tabelle wird mit Itext erstellt und in die Spalten soll dann die Werte geschrieben werden.

Ich habe gerade herausgefunden, dass die Werte von ersten Spinner beim absenden der Daten mittels Button nicht mehr vorhanden sind.

2020-09-26 12:14:06.672 13422-13422/ D/Stanzabfälle: []
2020-09-26 12:14:06.672 13422-13422/ D/E-Motor: [20]



    PdfPCell cell5 = new PdfPCell(new 
    Paragraph(singleTonClass.getSchrottGewicht().toString().substring(1).replaceFirst("]", "")));
    PdfPCell cell6 = new PdfPCell(new Paragraph("Schrott,Stanzabfälle"));

mr1000

Hilfreich?
Kommentieren
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

26.09.2020, 12:19:01 via Website

Komisch, allerding hast du doch

getSchrottGewicht(int pos) mit Position definiert. Diese sehe ich bei dir nicht.
Was hier allerdings nicht stimmt, kann ich so leider nicht erkennen, da müsste man einmal durch debuggen

LG Pascal //It's not a bug, it's a feature. :) ;)

Hilfreich?
Kommentieren
Jokel
  • Forum-Beiträge: 1.530

26.09.2020, 12:52:40 via Website

getSchrottGewicht()

Gibt dir ganze array Liste zurück. Und nicht nur einen Tabellen Eintrag.

Was das PDF erwartet für den einen Eintrag ist ein string und nicht ein arrayListe.

Ich sagte dir auch das du am besten die Werte in einer for Schleife ausliest und dann in das PDF schreibst.

Deine Hausaufgaben arrayListe lernen hast du scheinbar nicht gemacht.

Hilfreich?
Kommentieren
Jokel
  • Forum-Beiträge: 1.530

26.09.2020, 12:59:14 via Website

Mal eine einfache Frage wechest Du etwa ständig zwischen den activity hin und her. Eingabe A dann in die PDF A einen Listen Eintrag machen. Dann zurück in die Eingabe......und wider in die PDF A.

Hilfreich?
Kommentieren
mr1000
  • Forum-Beiträge: 86

26.09.2020, 13:07:01 via Website

Hallo Jokel,

ich habe für jeden EditText eine ArrayListe erstellt:

 public ArrayList<String> getSperrGewicht(){
    return SperrGewicht;
}

public void setSperrBetrag(String st) {
    SperrBetrag.add(st);
}



public void setSperrPreis(String st) {
    SperrPreis.add(st);
}

u.s.w

somit wird doch jeder Wert alleine ausgegeben werden,oder?

Ich werde mich noch einmal einlesen, wie man mir ArrayListen arbeitet.

mr1000

— geändert am 26.09.2020, 13:27:15

Hilfreich?
Kommentieren
Jokel
  • Forum-Beiträge: 1.530

26.09.2020, 13:15:32 via Website

somit wird doch jeder Wert alleine ausgegeben werden,oder?

nein du bekommst die ganze liste.

es wird zeit das du den ganzen code offen legst so kommen wir nie zum ziel.

— geändert am 26.09.2020, 13:16:54

Hilfreich?
swa00
Kommentieren
mr1000
  • Forum-Beiträge: 86

26.09.2020, 13:44:05 via Website

Hallo Jokel,

 for (String object: singleTonClass.getSchrottGewicht()) {

        String schrott = "Schrott";
        Log.d(schrott,object);
    }

2020-09-26 13:30:22.552 24725-24725/ D/E-Motor: [Hallo]
2020-09-26 13:30:22.552 24725-24725/ D/E-Motor: [Hier]
2020-09-26 13:30:22.552 24725-24725/ D/E-Motor: [Bob]

Bei den anderen wird nichts ausgegeben.

Ich glaube der Fehler kommt von den Spinner selbst, nur weiß ich nicht, wo das Problem liegt.
Es wird immer nur der letzte Werte ausgegeben, die vorherigen nicht.

— geändert am 26.09.2020, 13:44:34

Hilfreich?
Kommentieren
Jokel
  • Forum-Beiträge: 1.530

26.09.2020, 14:07:26 via Website

Lege dein Projekt offen. Sonst kann ich nicht mehr helfen. Oder Schicke mir einen link als Nachricht.

Hilfreich?
mr1000
Kommentieren
Jokel
  • Forum-Beiträge: 1.530

26.09.2020, 17:37:55 via Website

Hallo
Das Problem liegt erstmal in der Klasse AbrechnungFragment.

Vorallen wie du deine dynamisch erzeugten EditTexte abfragst.

Du hast einen Button den du betätigst, wenn du alle Eingaben gemacht hast.
In dem Klicklistener fragst du nur die letzten drei EditTexte ab und speicherst sie auch in der Singelton Klasse. Mehr nicht.

Wenn du jetzt am Anfang zb. 3 eingeben hast, sind das 9 Editexte die du abfragen und speichern musst.

Du musst deine Editexte schon auch dynamisch machen. Du hast da ja nur drei statische Variablen. Die jedem dynamischen EditText gibst geht nicht.

Auch das mit dem Spinner scheint so nicht richtig zu sein zumindest der erste. Denn der Listener wird nur einmal aufgerufen schon zu einem Zeitpunkt wo du noch gar nichts ausgewählt ist. Wenn du bei dem ersten Spinner was aus wählst wird er nicht aufgerufen.

Bei den anderen geht es auch wenn ich zwischendurch etwas anderes auswähle.

Mit etwas Debugging ein zwei Brackpints, Einzelschritt und Variablen beobachten hättest du da ach draufkommen müssen.

PS. Halte dich in deinen Programm an die Üblichen Namenkonventionen
Klassen fangen mit einen großen Buchstaben an.
Variablen, Instanzen… mit kleinen Buchstaben.

Ob noch weitere Fehler versteckt sind habe ich nicht angesehen das reicht erst mal.

— geändert am 27.09.2020, 18:35:05

Hilfreich?
Kommentieren
mr1000
  • Forum-Beiträge: 86

26.09.2020, 17:44:15 via App

Vielen Dank, für deine Hilfe!

Hilfreich?
Kommentieren
Jokel
  • Forum-Beiträge: 1.530

26.09.2020, 17:55:46 via Website

Der Listener des Sinners gehört auch in die for schleife dann wird auch für jeden Spinner ein Listener erstellt.

Auch sinnlos ist das du versuchst im Spinner Listener den ausgewählte Pos in die Statische Variable zu Speichen. Da speicherst du auch wieder nur die letzte Pos.

Statische Variablen sind hier zum gröbsten teil fehl am Platz arbeite dynamisch.

PS.
Ob das Designe bei 10 Spalten noch sinnvoll ist ?
Ich finde es nicht schön und schon ab 5 Spinner unübersichtlich. Ein ewiges gerolle.

— geändert am 26.09.2020, 18:14:39

Hilfreich?
mr1000Pascal P.
Kommentieren
Jokel
  • Forum-Beiträge: 1.530

27.09.2020, 14:43:59 via Website

Hallo noch ein paar ergänzende Worte.

Auch in deiner CreatePDF Aktivity ist einiges nicht richtig. Du fragst da zwar die Singelton Liste in eine for schleife ab. Aber was machst du da wieder, du willst wieder alle Einträge die in der Liste sind in eine Statische Variable speichern. Wenn da jetzt 10 Werte enthalten wären würdest du auch wieder nur den letzten Wert in der Variablen haben. Da musst du schon einen Wert aus der Liste holen und ihn auch gleich in der PDF Tabelle eintragen. Und das bei jeden durchlauf der for schleife.

Im gesamten finde ich dein Konzept wie du das machen willst ziemlich umständlich und wie du siehst auch Fehler trächtig.

Wieso eigentlich so viele Listen?

Was hast du, du hast pro Teil 3 eigentlich 4 Texte Preis, Gewicht, Betrag und der vierte währe der Spinner in dem steht was es ist.

Dafür würde ich eine Daten Klasse machen in der du 4 Strings hast. Sorte , Preis, Gewicht, Betrag
Dazu vielleicht auch die entsprechenden Getter und Setter. Von dieser Datenstruktur erstellst du in der Singelton Klasse eine ArrayListe. So nun hast du alles beisammen und kannst auch sinn voll darauf zugreifen. In einer for Schleife kannst du nacheinander alles auslesen und immer alle vier Werte in deine Pdf Tabelle schreiben.

— geändert am 27.09.2020, 20:10:02

Hilfreich?
mr1000
Kommentieren