-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

相关问题