ListView是一个经常要使用的控件,大部分情况下,我们都会通过适配器来为ListView添加内容,即调用ListView中的setAdapter(ListAdapter adapter)方法,其参数adapter是我们单独定义的。在调用这个方法的时候,一旦出现空指针异常,我们的第一反应就是检查ListView有没有实例化,但是我们发现ListView已经实例化了还是会出现这种异常,这是为什么呢??或许就是因为我们的这个第一反应才导致问题这么纠结。
我今天就遇到了这样的问题,
parseBtn = (Button) findViewById(R.id.parse);
listView = (ListView) findViewById(R.id.listview);
parseBtn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
persons = MainActivity.this.readXml();
adapter = new ArrayAdapter<Person>(MainActivity.this,
android.R.layout.simple_expandable_list_item_1, persons);
listView.setAdapter(adapter);
}
});
通过findViewById已经获取到了一个ListView对象,还是出现了空指针异常,当时实在想不明白,
然后我就想是不是setAdapter()方法的参数adapter是null导致的呢?通过检测发现adapter对象不是空的,我就更疑惑了,
然后我就进一步往前看,考虑是不是在实例化adapter时,new ArrayAdapter<Person>的参数是空的呢?前两个参数是不会有问题的,第三个参数persons是一个ArrayList<Person>对象(Person是另外的一个类),它有没有实例化呢?通过检查发现问题果然出在这,ArrayList<Person>没有实例化。实例化之后,问题果断解决。
所以在使用ListView或者与其比较类似的GridView时,为其添加适配器如果遇到空指针异常不妨往适配器身上考虑一下,
作为一个新手,为这个问题纠结了一晚上,不得不说这是一个艰辛但是美好的过程,写这篇博文记录一下,提醒自己不要再犯这种错误了。