-1

我想填充一個ListView使用ArrayAdapter,我填充從EditText輸入。我的程序似乎編譯正常,但在應用程序啓動時,它立即崩潰。我懷疑這與我嘗試設置列表視圖有關。我不確定我正在初始化錯誤,導致我的應用程序立即崩潰。任何和所有的提示將不勝感激。提前致謝!使用ArrayAdapter生成ListView

這是我對我的ArrayListAdapter的全球聲明。

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

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

我的適配器類別:

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; 
    } 
} 

ListViewonCreate方法裏面。

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

我假設我的問題是不是我的EditText輸入內部,因爲他們是一個OnClickListener方法裏面,但只是櫃面我在下面附了。

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方法的要求補充說:

@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); 

} 

移動我的適配器和ArrayList到我onCreate後,我得到一個新的錯誤。我對空指針做了一些研究,但是我已經初始化了這兩個指針。下面是我的logcat,有什麼想法?由於

+1

把你的堆棧跟蹤帶有錯誤 –

+0

什麼是'MainActivity.java'第21行?你不能在onCreate方法之外創建一個新的ScoreAdapter –

+0

這是因爲我的適配器是在我的'onCreate'之外聲明的。我已經移動它,但現在收到空指針錯誤,但我不知道爲什麼,因爲我相信我已正確初始化其他一切。 –

回答

0

這是我爲我的ArrayList和適配器全局聲明。

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

可以聲明那些全球範圍內,但對於適配器,該this參數必須/ onCreate後的使用,因爲錯誤說

系統服務不提供給活動前onCreate()

例如

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

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

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

我已經將我的'ArrayList'和''adapter'移動到我的'onCreate'中,但是應用程序在啓動時仍然崩潰。此外,當我在我的'OnClickListener'方法中試圖添加到我的'ArrayList'時,我收到一個錯誤(無論我的ArrayList是在我的'onCreate'還是全局內部聲明的,都會發生這種情況。任何想法爲什麼? –

+0

那麼,這個特定的代碼修復了最初的錯誤,我無法回答爲什麼你的應用程序崩潰,而沒有看到你的堆棧跟蹤 –

+0

我已經在logcat中添加到我的主帖子中,看起來像我的ListArray沒有正確初始化,但我無法弄清楚原因 –

1

確保super.onCreate(savedInstanceState)是你在你的onCreate呼叫的第一件事情(),也沒有試圖setContentView()之前從佈局XML訪問任何觀點。

編輯:

初始化適配器onCreate()方法,而不是全局做。

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

對不起,我是SO新手。我已經更新了我的問題以包含我的'onCreate'。不知道你是否收到這個通知,但如果你這樣做,我很困擾你,我很抱歉! –

+0

更新了答案。 – Amit