Android ListView:空指针异常

Android 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

你好。我的android项目有一些问题,特别是listview。我尝试在这个网站上搜索其他信息,并实现了一些答案。然而,它仍然不起作用

具体的错误是

MainActivity第76行的NullPointerException

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()