美好的一天.我的
android项目特别是listview有一些问题.我尝试在这个网站上搜索其他信息,并实现了一些答案.但是,它仍然无法正常工作.
具体的错误是
NullPointerException at line 76 at MainActivity
这是我的MainActivity的代码
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; } }
顺便说一下76号线
aa.notifyDataSetChanged();
这是我的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>
解决方法
在AddStudents类中,您在实例化MainActivity之后立即调用notifyArray().不会仅通过实例化来调用MainActivity.onCreate().
实例化您的MainActivity可能不是您想要的(因为该对象将在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实例,它就可以正常工作. (如果没有,你可以使数组本身是静态的;或者为它创建一个Singleton包装类.)