ArrayList Problem

  • Antworten:15
  • Bentwortet
Meister
  • Forum-Beiträge: 55

30.09.2018, 12:48:33 via Website

Ich programmiere eine kleine simple Quiz app, bin eigentlich auch schon fertig aber es werden bloß die letzten zwei eingetragenen Fragen, der klasse Fragen im Spiel übergeben. Das heißt, dass die Vorletzte Frage die erste ist und die letzte Frage die zweite. bei der darauffolgenden Frage, werden die Buttons usw. angezeigt aber keine Fragen un dAntworten und beim Klick auf einen Button stürzt die App ab.

public class Fragen {

ArrayList<String[]> fragen;

public Fragen() {
    fragen = new ArrayList<>(23);

    listeFuellen();
}


private void listeFuellen() {

    String[] frage1 = new String[5];
    frage1[0] = "Wieviele testfragen blabla?";
    frage1[1] = "3";
    frage1[2] = "9";
    frage1[3] = "2";
    frage1[4] = "4";

    String[] frage2 = new String[5];
    frage2[0] = "Was ist die Wurzel aus √81?";
    frage2[1] = "3";
    frage2[2] = "9";
    frage2[3] = "9,9";
    frage2[4] = "Ich habe keinen Taschenrechner.";... usw. 23 Fragen insgesamt.

fragen.add(0, frage1);
    fragen.add(1, frage2);
    fragen.add(2, frage3);
    fragen.add(3, frage4);
    fragen.add(4, frage5);
    fragen.add(5, frage6);
    fragen.add(6, frage7);
    fragen.add(7, frage8);
    fragen.add(8, frage9);
    fragen.add(9, frage10);
    fragen.add(10, frage11);
    fragen.add(11, frage12);
    fragen.add(12, frage13);
    fragen.add(13, frage14);
    fragen.add(14, frage15);
    fragen.add(15, frage16);
    fragen.add(16, frage17);
    fragen.add(17, frage18);
    fragen.add(18, frage19);
    fragen.add(19, frage20);
    fragen.add(20, frage21);
    fragen.add(21, frage22);
    fragen.add(22, frage23);



}

public ArrayList<String[]> getFragen() {
    return fragen;
}

}

Das ist die Fragen Klasse. Da ich ein Neuling bin, arbeite ich erstmal ohne Datenbanken.
Findet ihr hier einen Fehler? Oder kann es sein, dass der Fehler eher in der Quizspiel Klasse+activity ist?

Kommentieren
Beste Antwort
Gelöschter Account
  • Forum-Beiträge: 79

30.09.2018, 17:06:15 via Website

Hmm, kann hier im Code eigentlich nichts erkennen, woran das liegen könnte.

Wie sieht denn der Code an der Stelle aus, wo du geschrieben hast "u.s.w. 23 Fragen insgesamt"? Vielleicht schreibst du da iwas falsches in die Fragen.

Hilfreich?
Meister
Kommentieren
Meister
  • Forum-Beiträge: 55

30.09.2018, 12:54:32 via Website

hier ist noch die Quiz klasse in der das Quiz gespielt wird. Habe mich an ein Youtube Tutorial gerichtet aber der Typ selber hatte null Plan davon, weswegen ich viele abändern und hinzufügen musste...

public class Spiel extends Activity implements View.OnClickListener {

Button btnAntwortEins, btnAntwortZwei, btnAntwortDrei, btnAntwortVier;
TextView tvFrageAnzeigen, tvScore;
int aktuelleFrage = 0;
int punkte = 0;



@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_spiel);

    btnAntwortEins = (Button) findViewById(R.id.btnAntwortEins);
    btnAntwortZwei = (Button) findViewById(R.id.btnAntwortZwei);
    btnAntwortDrei = (Button) findViewById(R.id.btnAntwortDrei);
    btnAntwortVier = (Button) findViewById(R.id.btnAntwortVier);

    tvFrageAnzeigen = (TextView) findViewById(R.id.tvAnzeigeFrage);
    tvScore = (TextView) findViewById(R.id.tVScore);

    btnAntwortEins.setOnClickListener(this);
    btnAntwortZwei.setOnClickListener(this);
    btnAntwortDrei.setOnClickListener(this);
    btnAntwortVier.setOnClickListener(this);
    frageLaden();
}

private void frageLaden(){

    Fragen fragenC = new Fragen();
    ArrayList<String[]> fragen = fragenC.getFragen();
    String[] frage =  fragen.get(aktuelleFrage);

    tvFrageAnzeigen.setText(frage[0]);

    int zufallszahl = (int) (Math.random() * (4-1) +1);

    switch (zufallszahl){
        case 1:
            btnAntwortEins.setText(frage[1]);
            btnAntwortZwei.setText(frage[2]);
            btnAntwortDrei.setText(frage[3]);
            btnAntwortVier.setText(frage[4]);
            break;
        case 2:
            btnAntwortEins.setText(frage[4]);
            btnAntwortZwei.setText(frage[1]);
            btnAntwortDrei.setText(frage[2]);
            btnAntwortVier.setText(frage[3]);
            break;
        case 3:
            btnAntwortEins.setText(frage[3]);
            btnAntwortZwei.setText(frage[4]);
            btnAntwortDrei.setText(frage[1]);
            btnAntwortVier.setText(frage[2]);
            break;
        case 4:
            btnAntwortEins.setText(frage[2]);
            btnAntwortZwei.setText(frage[3]);
            btnAntwortDrei.setText(frage[4]);
            btnAntwortVier.setText(frage[1]);
            break;

    }
    tvScore.setText("Punkte: " + punkte);
}

@Override
public void onClick(View view) {

    switch (view.getId()){
        case R.id.btnAntwortEins:
            if(frageAuswerten(btnAntwortEins.getText().toString())){
                punkte++;
            }
            if (aktuelleFrage>=22){
                Intent intent = new Intent (this, Ende.class);
                intent.putExtra("Punkte", punkte);
                startActivity(intent);
                finish();

            }
            else {
                aktuelleFrage++;
                frageLaden();
            }
            break;
        case R.id.btnAntwortZwei:
            if(frageAuswerten(btnAntwortZwei.getText().toString())){
                punkte++;
            }
            if (aktuelleFrage>=22){
                Intent intent = new Intent (this, Ende.class);
                intent.putExtra("Punkte", punkte);
                startActivity(intent);
                finish();

            }
            else {
                aktuelleFrage++;
                frageLaden();
            }
            break;
        case R.id.btnAntwortDrei:
            if(frageAuswerten(btnAntwortDrei.getText().toString())){
                punkte++;
            }
            if (aktuelleFrage>=22){
                Intent intent = new Intent (this, Ende.class);
                intent.putExtra("Punkte", punkte);
                startActivity(intent);
                finish();

            }
            else {
                aktuelleFrage++;
                frageLaden();
            }
            break;
        case R.id.btnAntwortVier:
            if(frageAuswerten(btnAntwortVier.getText().toString())){
                punkte++;
            }
            if (aktuelleFrage>=22){
                Intent intent = new Intent (this, Ende.class);
                intent.putExtra("Punkte", punkte);
                startActivity(intent);
                finish();

            }
            else {
                aktuelleFrage++;
                frageLaden();
            }
            break;


    }

}
private boolean frageAuswerten(String btnText){
    boolean frage = false;
    Fragen fragenC = new Fragen();
    ArrayList fragen = fragenC.getFragen();
    String[] speicher = (String[]) fragen.get(aktuelleFrage);
    if (speicher[1].equals(btnText)){
        frage = true;
    }
    return frage;

}

}

Hilfreich?
Kommentieren
Gelöschter Account
  • Forum-Beiträge: 79

30.09.2018, 14:54:47 via Website

Moin.

Also was mir als erstes aufgefallen ist, ist, dass man, wenn man eine List verwendet, eigentlich nicht mit angeben muss, wie groß die sein soll und an welcher Stelle die Einträge eingefügt werden sollen. Ich kann nicht sagen, ob das die Fehlerquelle ist, aber ich würde (auch damit es ordentlicher wird) die "23" bei der Initialisierung wegmachen und bei den ganzen ".add"-Befehlen auch die Positionen wegmachen.

An welcher Stelle und bei welchem Button genau stürzt die App denn ab?
Mir ist aufgefallen, dass deine OnClick-Methode ein switch-case enthält, wo im Prinzip immer dasselbe gemacht wird. Das kannst du dir eigentlich sparen, wenn du den Text direkt aus der übergebenen "view" holst.
Das ist auch das erste Mal, dass ich sehe, dass als OnClickListener für die Buttons die Activity verwendet wird. Kann sein, dass das funktioniert, habe ich aber wie gesagt noch nie gesehen. ^^

Hilfreich?
Meister
Kommentieren
Meister
  • Forum-Beiträge: 55

30.09.2018, 15:02:01 via Website

Ich habe die initialisierung (23) bereits entfernt gehabt und auch die positionen bei den add. Befehlen.Es bleibt dabei, dass die erste Frage die vorletzte ist und die zweite Frag die Letzte. Also die ersten 21 Frage werden übersprungen. wenn man die beide Fragen durch klicken auf die buttons beantwortet hat, dann wird mir als dritte Frage keine angezeigt und die Buttons sinf auch leer. Beim Klick auf einen leete Button stürzt die apl dann ab.
Bin erst um 23 Uhr wieder Zuhause, dann gucken ich mir das mit dem switch case an.

Hilfreich?
Kommentieren
Beste Antwort
Gelöschter Account
  • Forum-Beiträge: 79

30.09.2018, 17:06:15 via Website

Hmm, kann hier im Code eigentlich nichts erkennen, woran das liegen könnte.

Wie sieht denn der Code an der Stelle aus, wo du geschrieben hast "u.s.w. 23 Fragen insgesamt"? Vielleicht schreibst du da iwas falsches in die Fragen.

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

30.09.2018, 17:21:07 via Website

p.P.Hi zum abbrechen der app würde ich sagen es ligt in deiner auswetete Methode und zwar hier hast du den Typ falsch angegeben.

ArrayList fragen = fragenC.getFragen();

Sollte so aussehen.

ArrayList<String[]> fragen = fragenC.getFragen();

Deshalb will der Compiler auch hier ein cast haben

String[] speicher = (String[]) fragen.get(aktuelleFrage);

Aber im weiteren Verlauf kommt logischerweise ein Fehler raus.

Zu dem Thema das nur die letzten beiden Fragen in der liste sein sollen. Kann ich nicht ganz glauben.

Beim erstellen der Liste brauchst du auch nicht angeben wievielte Einträge es werden sollen.
Du reserviert 24 Einträge speicherst arber nur 23 ab .
Beim speichern adden der Fragen brauchst du auch nicht den Speicher Ort angeben.

fragen.add( frage1); und so weiter reicht.

Auch wurde ich nicht Jedes mal die Liste neu erstellen lassen.
Würde die variable fragen global im Klassen Rumpf erstellen.
In der onCreate den die Instanz der klasse erzeugen und der globalen Variablen fragen die Liste zuweisen.
Somit hast du die Liste immer verfügbar. Somit brauchst du sie auch nicht in der auswerte Methode neu erstellen.

— geändert am 01.10.2018, 10:08:33

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

30.09.2018, 17:56:44 via Website

@Robert S
Die onClick Methode ist voll ok und richtig. Dafür hat er ja auch das Interface importirt.

Das switch braucht er um auf die vier Button die geclickt werden können zu reagieren. Klar kann man das etwas eleganter machen. Mehr im sinne von Oop. Sollte aber so funktionieren.

Er sagte auch das es beim klick auf einen Button abstürzt also muss der Fehler in der onClick Methode liegen und nicht außerhalb bei den 23 fragen.

Hilfreich?
Meister
Kommentieren
Meister
  • Forum-Beiträge: 55

30.09.2018, 23:38:55 via Website

@jokel
ich habe nicht ganz verstanden, was du mit dem falschen Typ bei der Auswerten Methode meinst.
Also die App läuft aber zeigt blos zwei Fragen an und bei der dritten Frage, da kommt nicht, weil er komischerweise auf die stelle 23 in der Arraylist zugreift und da nichts ist. Die erste Frage ist auch die Frage nr. 21 in der Arraylist und die zweite Frage ist die Frage nr. 22 in der Arraylist.
Die App stürzt wahrscheinlich ab, weil die Auswerten Methode nicht zum Auswerten bekommt.
Ich saß nun gefühlte 10 Stunden an dem selben Code und finde den Fehler nicht ^^

@Robert S.
Da gibt es keinen Fehler. Ich habe auch kopiert und eingefugt und fragex umgeändert. also von 1 bis 23
frage1, frage2, frage3 usw.

Hilfreich?
Kommentieren
Meister
  • Forum-Beiträge: 55

30.09.2018, 23:46:27 via Website

so jungs, jetzt kommt was ganz interessantes. Wenn ich die Stelle 0 aufrufe also

private void frageLaden(){

    Fragen fragenC = new Fragen();
    ArrayList<String[]> fragen = fragenC.getFragen();
    String[] frage =  fragen.get(0); //hier Stelle 0 in der Arraylist.

Dann ruft er die vorletzte Stelle der Arraylist auf und wenn ich die beantworte, dann logischerweise erneut und wenn ich die beantwortet habe, dann auch logischerweise erneut aber wenn ich die beantworte, dann stürzt die App ab.

Hilfreich?
Kommentieren
Meister
  • Forum-Beiträge: 55

30.09.2018, 23:56:15 via Website

Jungs.. ihr lacht euch tot, wenn ich euch sage, wo der Fehler lag ^^
Oh man.. wenn man eine weile am Programmieren ist, dann übersieht man sowas schnell.
Ich hätte bloß eine Frage in der Arrayliste hier mehr posten sollen anstelle des usw..

String[] frage1 = new String[5];
frage1[0] = "Wieviele testfragen blabla?";
frage1[1] = "3";
frage1[2] = "9";
frage1[3] = "2";
frage1[4] = "4";

String[] frage2 = new String[5];
frage2[0] = "Wieviele testfragen blabla?";
frage2[1] = "3";
frage2[2] = "9";
frage2[3] = "2";
frage2[4] = "4";

String[] frage3 = new String[5];
frage1[0] = "Wieviele testfragen blabla?";
frage1[1] = "3";
frage1[2] = "9";
frage1[3] = "2";
frage1[4] = "4";

Seht ihr den Fehler?^^
Copy paste halt

Hilfreich?
Kommentieren
swa00
  • Forum-Beiträge: 3.704

01.10.2018, 00:09:13 via Website

Hallo Meister,

ich habe mich bis jetzt im Hintergrund gehalten.
Du vermischst Dynamisch mit Statisch, das kann nur schief gehen.
ArrayList ist nunmal dazu gemacht , dynamisch zu arbeiten - du machst aber mit aller Gewalt wieder was statisches draus.

Deine Initalisierung stimmt somit überall nicht, das muss ein wenig anders gestaltet werden.

In der Fragen Klasse :

ArrayList<String> fragen =  new  ArrayList();

Dann fügst du deine Elemente dynamisch und richtig mit "add" hinzu

Bsp:

for ( int i = 0; i < 10;i++)
{
String test = "TTTTTT_" + i;
fragen.add(test);
}

und den Getter

public ArrayList < String > getFragen() {
return fragen;
}

und in deiner Main vermischst du auch - das muss so sein :

Fragen fragenC = new Fragen();
ArrayList < String > fragen = fragenC.getFragen();
String frage = fragen.get(0);

Und dann machst du mal bitte ein ordenliches Try / catch drum rum und gibst die exceptions aus
Das fehlt überall bei Dir. Desweiteren fängst du dann noch ArrayList.size() ab;

P.S Eigene dir mal bitte den Umgang mit dem Debugger an und stepp mal durch .
Dann brauchst du viele Fragen hier nicht zu stellen .

— geändert am 01.10.2018, 00:26:17

Liebe Grüße - Stefan
[ App - Entwicklung ]

Hilfreich?
Meister
Kommentieren
Gelöschter Account
  • Forum-Beiträge: 79

01.10.2018, 07:40:20 via Website

Moin Meister,
also war es ja am Ende doch nur ein kleiner copy/paste Fehler beim Anlegen. :-D
Funktioniert es denn jetzt richtig? Wenn ja, dann nutze am besten die Gelegenheit und mache den Code noch ein wenig ordentlicher, bevor du weitere Funktionen einfügst. Je ordentlicher der Code, umso schwieriger können sich Fehler verstecken. ;-)

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

01.10.2018, 10:04:33 via Website

@ saw00

for ( int i = 0; i < 10;i++)
{
String test = "TTTTTT_" + i;
fragen.add(test);
}

Ist nicht das was er will er will eine Liste mit String arrays haben.
Nicht eine Liste mit String.

@Meister
Ich meinte den Typ wie du die variable In der auswerte Methode erstellst. Da hat dir saw00 nun nochmal den richtigen gegeben.
Auch hat er recht das du eine dynamische Liste statisch vergewaltigen willst.
Das habe ich dir gezeigt und saw00 noch mal.
Wobei er nur von einem einfache String ausgeht und nicht von einem String Array was du ja willst.
Ansonsten ist es genau das gleiche was ich auch schon gesagt habe.
Ok ich verstehe warum du meinen tipp nicht verstanden hast weil das Forum die spitzen klammen ausgeblendet hatte. Habe es geändert.

— geändert am 01.10.2018, 10:13:30

Hilfreich?
Meister
Kommentieren
swa00
  • Forum-Beiträge: 3.704

01.10.2018, 10:10:28 via Website

Ist nicht das was er will er will eine Liste mit String arrays haben.
Nicht eine Liste mit String.

Ich habe explizit "Beispiel" resp "Bsp" drüber geschrieben, damit er die Anwendung von "add" für seine Sub-Arrays ersehen kann. Mehr nicht.

in "listeFuellen" geht er nämlich hin und setzt die einzelnen SubArrays statisch, kann aber später heraus nicht mehr feststellen , wieviel wirklich drin sind.
Hier soll er auch dynamische und nicht statische Arrays bilden und mit size arbeiten.

Liebe Grüße - Stefan
[ App - Entwicklung ]

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

01.10.2018, 10:28:07 via Website

Ja das stimmt habe ich auch schon gesagt gehabt.
Das er den Index nicht angeben braucht.
Und mit dem Typ hatte das Forum die spitzen klammern verschluckt. Am Handy ist das immer etwas doof mit der Eingabe sorry.

— geändert am 01.10.2018, 10:28:33

Hilfreich?
Kommentieren
Meister
  • Forum-Beiträge: 55

01.10.2018, 10:45:38 via Website

@Robert S.
Ja genau, ihr hatte so gesehen beide den Fehler erkannt wobei du die Ursache erahnt hast.
Ich da ke auch aufjedenfall.

@All
Werde den Code heute noch bisschen säubern. Danke für die Tipps.

Hilfreich?
Kommentieren