-1

Ich versuche, eine ListView mit einer ArrayAdapter, die ich mit Eingabe von einem EditText füllen füllen. Mein Programm scheint gut zu kompilieren, aber beim Start der App stürzt es sofort ab. Ich vermute, dass es etwas damit zu tun hat, dass ich versuche, meine Listenansicht einzurichten. Ich bin mir nicht sicher, was ich falsch initialisiere, so dass meine App sofort abstürzt. Alle und alle Tipps würden sehr geschätzt werden. Danke im Voraus!Erstellen einer ListView mit ArrayAdapter

Dies ist meine globale Deklarationen für meine ArrayList und Adapter.

ArrayList<scoreScreen> savedScores = new ArrayList<>(); 
ScoreAdapter adapter = new ScoreAdapter(this, savedScores); 

ListView listView = (ListView) findViewById(R.id.dispScores); 
listView.setAdapter(adapter); 

My Adapter Klasse:

private class ScoreAdapter extends ArrayAdapter<scoreScreen> { 
    private ScoreAdapter(Context context, ArrayList<scoreScreen> scores) { 
     super(context, 0, scores); 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     scoreScreen score1 = getItem(position); 
     if (convertView == null){ 
      convertView = LayoutInflater.from(getContext()).inflate(R.layout.item_scores, parent, false); 
     } 
     TextView holeNum = (TextView) convertView.findViewById(R.id.holeNum); 
     holeNum.setText(score1.hole); 
     return convertView; 
    } 
} 

Mein ListView Innenseite meiner onCreate Methode.

ListView listview = (ListView) findViewById(R.id.listView1); 
    listview.setAdapter(adapter); 

ich mein Problem gehe davon ist nicht in meinen EditText Eingängen, da sie innerhalb einer OnClickListener Methode ist, aber nur für den Fall habe ich es unten angebracht.

public View.OnClickListener onClickListener = new View.OnClickListener() { 

    @Override 
    public void onClick(View view) { 
     EditText input1 = (EditText) findViewById(R.id.scorePrompt); 
     TextView output1 = (TextView) findViewById(R.id.textTotal); 
     String blankCheck = input1.getText().toString(); //CHANGE INPUT IN scorePrompt TO STRING 
     switch (view.getId()) { 
      case R.id.buttTotal: 
        if (blankCheck.equals("")) { 
         Toast blankError = Toast.makeText(getApplicationContext(), "YOU CANT SKIP HOLES JERK", Toast.LENGTH_LONG); 
         blankError.show(); 
         break; 
        } else { 
         int num1 = Integer.parseInt(input1.getText().toString()); //Get input from text box 
         int sum = num1 + score2; 
         score2 = sum; 
         output1.setText("Your score is : " + Integer.toString(sum)); 
         //savedScores.add(input1.getText().toString()); 

         scoreScreen addScore = new scoreScreen("Score is" + num1); 
         adapter.add(addScore); 
         j++; 
         input1.setText(""); //Clear input text box 
         break; 
        } 
      case R.id.allScores: //CHANGE THIS TO AN EDIT BUTTON, ADD A HOLE NUMBER COUNTER AT TOP OF SCREEN!!!!! 
       output1.setText("you messed up"); 
       break; 
      case R.id.editScore: //Need to set up Save Array before we can edit 
       //CURRENTLY ONLY DISPLAYS THE LAST NUNMBER IN THE TEXTEDIT, NEED TO SET UP LISTVIEW!!!!!! 
       for (int i=0; i < j; i++){ 
       // output1.setText(savedScores.get(i)); 
       } break; 
     } 
    } 
}; 

onCreate Verfahren wie gewünscht hinzugefügt:

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

    /*Button scoresAct = (Button) findViewById(R.id.allScores); //THIS IS TO GO TO ALL SCORES ACTIVITY 
    scoresAct.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      Intent scoreScreen = new Intent(MainActivity.this, AllScoresAct.class); 
      startActivity(scoreScreen); 
     } 
    });*/ 

    Button sumScores = (Button) findViewById(R.id.buttTotal); 
    Button saveScores = (Button) findViewById(R.id.allScores); 
    Button changeScores = (Button) findViewById(R.id.editScore); 
    sumScores.setOnClickListener(onClickListener); 
    saveScores.setOnClickListener(onClickListener); 
    changeScores.setOnClickListener(onClickListener); 

    ListView listview = (ListView) findViewById(R.id.listView1); 
    listview.setAdapter(adapter); 

} 

Nach meinem Adapter und Arraylist in meinem onCreate bewegen, bekomme ich einen neuen Fehler. Ich habe etwas über Nullzeiger geforscht, aber ich habe beide bereits initialisiert. Unten ist mein Logcat, irgendwelche Ideen? Danke

+1

setzen Sie Ihren Stacktrace hier mit den Fehlern –

+0

Was ist bei 'MainActivity.java' Zeile 21? Sie können keinen 'neuen ScoreAdapter' außerhalb der onCreate-Methode erstellen –

+0

Das liegt daran, dass mein Adapter außerhalb von 'onCreate' deklariert wurde. Ich habe es seitdem verschoben, aber jetzt bekomme ich einen Nullzeigerfehler, aber ich bin nicht sicher warum, weil ich glaube, dass ich alles andere richtig initialisiert habe. –

Antwort

0

Dies ist meine globalen Erklärungen für meine Arraylist und Adapter.

ArrayList<scoreScreen> savedScores = new ArrayList<>(); 
ScoreAdapter adapter = new ScoreAdapter(this, savedScores); 

Sie können erklären jene global, aber für den Adapter, der this Parameter müssen innerhalb von/nach onCreate verwendet werden, da der Fehler sagt

Systemdienste zu Aktivitäten nicht zur Verfügung vor onCreate()

Zum Beispiel

private ArrayList<ScoreScreen> savedScores = new ArrayList<>(); 
private ScoreAdapter adapter; 

@Override 
protected void onCreate(Bundle b) { 
    ... 

    adapter = new ScoreAdapter(this, savedScores); 
} 
+0

Ich habe seither sowohl meine 'ArrayList' als auch meinen' Adapter' in den 'onCreate' verschoben, aber die App stürzt beim Start immer noch ab. Außerdem erhalte ich einen Fehler, wenn ich versuche, während meiner 'OnClickListener' Methode in meine'ArrayList' zu fügen (dies geschieht unabhängig davon, ob meine' ArrayList' innerhalb von 'onCreate' oder global deklariert ist. Irgendwelche Ideen warum? –

+0

Nun, dieser spezifische Code behebt den anfänglichen Fehler.Ich kann nicht beantworten, warum sonst Ihre App abstürzt, ohne Ihre Stacktraces –

+0

zu sehen, die ich im Logcat zu meinem Hauptpost hinzugefügt habe.Es scheint, dass mein ListArray nicht richtig initialisiert wurde, aber ich kann es nicht herausfinden Der Grund: –

1

Stellen Sie sicher super.onCreate(savedInstanceState) ist die erste Sache, die Sie in Ihrem onCreate() aufrufen und auch nicht versuchen, auf eine Ansicht aus dem Layout XML vor setContentView() zuzugreifen.

EDIT:

den Adapter in onCreate() Methode initialisieren, statt sie global zu tun.

onCreate() { 
    ....... 
    this.adapter = new ScoreAdapter(this, savedScores); 
} 
+0

Entschuldigung, ich bin neu in SO. Ich habe meine Frage so aktualisiert, dass sie auch mein 'onCreate' enthält. Ich bin mir nicht sicher, ob Sie eine Benachrichtigung erhalten, aber wenn Sie es tun und ich störe Sie, es tut mir leid! –

+0

Die Antwort wurde aktualisiert. – Amit

Verwandte Themen