Android ListView:空指针异常
你好。我的android项目有一些问题,特别是listview。我尝试在这个网站上搜索其他信息,并实现了一些答案。然而,它仍然不起作用 具体的错误是 MainActivity第76行的NullPointerExceptionAndroid ListView:空指针异常,android,listview,Android,Listview,你好。我的android项目有一些问题,特别是listview。我尝试在这个网站上搜索其他信息,并实现了一些答案。然而,它仍然不起作用 具体的错误是 MainActivity第76行的NullPointerException import java.util.ArrayList; import android.os.Bundle; import android.app.Activity; import android.content.Intent; import android.view.Me
import java.util.ArrayList;
import android.os.Bundle;
import android.app.Activity;
import android.content.Intent;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ListView;
public class MainActivity extends Activity {
final ArrayList<String> studentName = new ArrayList<String>();
ArrayAdapter<String> aa;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ListView myList = (ListView) findViewById(R.id.listName);
aa = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, studentName);
myList.setAdapter(aa);
//droid.R.id.list;
//add
Button bAdd = (Button) findViewById(R.id.addstudent);
bAdd.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v) {
startActivity(new Intent("android.intent.action.ADDSTUDENTS"));
}
});
//edit
Button bEdit = (Button) findViewById(R.id.editstudent);
bEdit.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View x) {
startActivity(new Intent("android.intent.action.EDITSTUDENTS"));
}
});
//edit
Button bDelete = (Button) findViewById(R.id.deletestudent);
bDelete.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View x) {
startActivity(new Intent("android.intent.action.DELETESTUDENTS"));
}
});
}
public ArrayList<String> getArray(){
return studentName;
}
public void notifyArray(){
aa.notifyDataSetChanged();
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}
}
Hashtable hash = CommonHashtable.getInstance();
Object studentName = (String) hash.get("NEW_STUDENT_NAME");
if(studentName != null){
notifyArray();
}
这是我主要活动的代码
import java.util.ArrayList;
import android.os.Bundle;
import android.app.Activity;
import android.content.Intent;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ListView;
public class MainActivity extends Activity {
final ArrayList<String> studentName = new ArrayList<String>();
ArrayAdapter<String> aa;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ListView myList = (ListView) findViewById(R.id.listName);
aa = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, studentName);
myList.setAdapter(aa);
//droid.R.id.list;
//add
Button bAdd = (Button) findViewById(R.id.addstudent);
bAdd.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v) {
startActivity(new Intent("android.intent.action.ADDSTUDENTS"));
}
});
//edit
Button bEdit = (Button) findViewById(R.id.editstudent);
bEdit.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View x) {
startActivity(new Intent("android.intent.action.EDITSTUDENTS"));
}
});
//edit
Button bDelete = (Button) findViewById(R.id.deletestudent);
bDelete.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View x) {
startActivity(new Intent("android.intent.action.DELETESTUDENTS"));
}
});
}
public ArrayList<String> getArray(){
return studentName;
}
public void notifyArray(){
aa.notifyDataSetChanged();
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}
}
Hashtable hash = CommonHashtable.getInstance();
Object studentName = (String) hash.get("NEW_STUDENT_NAME");
if(studentName != null){
notifyArray();
}
这是我的AddStudents课程代码
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
public class AddStudents extends Activity{
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.add_student);
Button bAddStudents = (Button) findViewById(R.id.add);
final EditText et = (EditText) findViewById(R.id.student_name);
bAddStudents.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v) {
MainActivity as = new MainActivity();
as.getArray().add(et.getText().toString());
as.notifyArray();
finish();
}
});
Button bBack = (Button) findViewById(R.id.backadd);
bBack.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v) {
finish();
}
});
}
}
列表视图的xml部分是
<ListView
android:id="@+id/listName"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1" >
</ListView>
我希望你能帮助我,因为我也想知道我的错误是什么。如果你愿意,我可以添加其他信息
notifyArray()
在onCreate
之前被调用,在AddStudents
类中,您在实例化MainActivity
之后立即调用notifyArray()
MainActivity.onCreate()
不会仅通过实例化来调用
实例化main活动
可能根本就没有您想要的内容(因为该对象将在onClick
处理程序完成后直接处理)
您需要的是访问MainActivity
的现有实例。为此,将对当前实例的引用添加到MainActivity
类的静态成员中,例如
public class MainActivity extends Activity {
public static MainActivity activity;
@Override
protected void onCreate(Bundle savedInstanceState) {
activity = this;
}
}
然后在您的AddStudent
课堂中,通过
MainActivity.activity.notifyArray()
这不是解决问题的最佳方法,但只要您能够确保只有一个MainActivity
实例,它就可以工作。(如果不是,可以将数组本身设置为静态;或者为它创建一个单例包装类。)尝试调用getArray().add(et.getText().toString());和notifyArray();在MainActivity的onResume()内,而不是从AddStudentActivity(不推荐!)
因此onResume()理想情况下,您希望向列表中添加一个新的学生,因此在您的情况下,您可以使用常用的可共享对象(如哈希表或类似对象)检索学生姓名,将其设置为单例,并从应用程序中的任何位置使用它
普通类可能类似于:
class CommonHashtable{
private static Hashtable<String, Object> commonHashtable = null;
public static getInstance(){
if(commonHashtable == null)
commonHashtable = new Hashtable<String, Object>();
return commonHashtable;
}
并将其添加到MainActivity的onResume()中
import java.util.ArrayList;
import android.os.Bundle;
import android.app.Activity;
import android.content.Intent;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ListView;
public class MainActivity extends Activity {
final ArrayList<String> studentName = new ArrayList<String>();
ArrayAdapter<String> aa;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ListView myList = (ListView) findViewById(R.id.listName);
aa = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, studentName);
myList.setAdapter(aa);
//droid.R.id.list;
//add
Button bAdd = (Button) findViewById(R.id.addstudent);
bAdd.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v) {
startActivity(new Intent("android.intent.action.ADDSTUDENTS"));
}
});
//edit
Button bEdit = (Button) findViewById(R.id.editstudent);
bEdit.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View x) {
startActivity(new Intent("android.intent.action.EDITSTUDENTS"));
}
});
//edit
Button bDelete = (Button) findViewById(R.id.deletestudent);
bDelete.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View x) {
startActivity(new Intent("android.intent.action.DELETESTUDENTS"));
}
});
}
public ArrayList<String> getArray(){
return studentName;
}
public void notifyArray(){
aa.notifyDataSetChanged();
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}
}
Hashtable hash = CommonHashtable.getInstance();
Object studentName = (String) hash.get("NEW_STUDENT_NAME");
if(studentName != null){
notifyArray();
}
studentName
arraylist的值是什么?你在arraylist中添加了任何值吗?检查这两个链接,@Grishu我没有在studentName数组列表中添加任何值。因为据我所知,我计划做的是,当AddStudent类中有一个新条目时(添加Studen时),它会自动进入studentName arraylist。如果我错了,请更正。在onCreate之前添加notifyArray()会导致错误,无法启动活动。。。空指针例外方法的位置不重要,我说过它是在onCreate()
之前调用的。因此,您应该查看调用notifyArray()
的位置,并将其固定在onCreate()
之后。或者如果你懒惰的话,在notifyArray()中加一个if(aa!=null)
检查一下。我理解。对不起,我误解了你的第一句话。现在来看。@domsom的回答也说明了这一点,但提供了更多的信息,所以我会遵循这一点——如果它解决了问题,我会接受它。@nmw我先尝试了你的答案,它消除了错误。现在唯一的问题是,即使它已经更新了。。。列表视图没有显示。先生,谢谢您的解释。我现在明白了这种关系为什么不起作用(特别是这种安排)。我尝试了nmw的答案,它奏效了,但列表没有显示(似乎是我列表中的另一个问题)。然后我尝试了你的答案(代码),问题是在AddStudent类中,它在MainActivity.activity.notifyArray()中给出了一个错误。。特别是在notifyArray部分。类型活动的notifyArrays()方法未定义。顺便说一句,我仔细检查了一下,它最后有一个s。我在回答中修复了它:activity
成员必须是main activity
类型。先生,错误现在消失了。谢谢如果你同意的话,我还有一个问题。我现在也在看。即使错误消失了,当我单击add时,它也很好。listview仍然没有显示出来。就架构而言,我不建议这样做:它引入了一种隐式的基于数据的依赖关系,并在不必要的地方引入了代码混乱。我的两分钱:如果您将数据操作留在StudentClass
中,并且只将通知移动到MainActivity
,那么可以使用广播意图触发该操作,或者无条件地调用MainActivity.onResume()
中的notifyArray()
。