《安卓应用开发学习》——关于使用ExpandableListView.setAdapter()方法发生空指针异常

来源:互联网 发布:新浪博客绑定域名 编辑:程序博客网 时间:2024/05/02 17:10

先贴出异常日志

03-06 23:39:51.101: E/AndroidRuntime(22049): FATAL EXCEPTION: main
03-06 23:39:51.101: E/AndroidRuntime(22049): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.xiangan.qq_client/com.xiangang.qq_client.MainQQActivity}: java.lang.NullPointerException
03-06 23:39:51.101: E/AndroidRuntime(22049):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2004)
03-06 23:39:51.101: E/AndroidRuntime(22049):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2029)
03-06 23:39:51.101: E/AndroidRuntime(22049):  at android.app.ActivityThread.access$700(ActivityThread.java:123)
03-06 23:39:51.101: E/AndroidRuntime(22049):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1178)
03-06 23:39:51.101: E/AndroidRuntime(22049):  at android.os.Handler.dispatchMessage(Handler.java:99)
03-06 23:39:51.101: E/AndroidRuntime(22049):  at android.os.Looper.loop(Looper.java:137)
03-06 23:39:51.101: E/AndroidRuntime(22049):  at android.app.ActivityThread.main(ActivityThread.java:4587)
03-06 23:39:51.101: E/AndroidRuntime(22049):  at java.lang.reflect.Method.invokeNative(Native Method)
03-06 23:39:51.101: E/AndroidRuntime(22049):  at java.lang.reflect.Method.invoke(Method.java:511)
03-06 23:39:51.101: E/AndroidRuntime(22049):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
03-06 23:39:51.101: E/AndroidRuntime(22049):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
03-06 23:39:51.101: E/AndroidRuntime(22049):  at dalvik.system.NativeStart.main(Native Method)
03-06 23:39:51.101: E/AndroidRuntime(22049): Caused by: java.lang.NullPointerException
03-06 23:39:51.101: E/AndroidRuntime(22049):  at com.xiangang.qq_client.MainQQActivity.initView(MainQQActivity.java:231)
03-06 23:39:51.101: E/AndroidRuntime(22049):  at com.xiangang.qq_client.MainQQActivity.onCreate(MainQQActivity.java:67)
03-06 23:39:51.101: E/AndroidRuntime(22049):  at android.app.Activity.performCreate(Activity.java:4730)
03-06 23:39:51.101: E/AndroidRuntime(22049):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049)
03-06 23:39:51.101: E/AndroidRuntime(22049):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1968)
03-06 23:39:51.101: E/AndroidRuntime(22049):  ... 11 more

根据这两行找到运行代码代码
03-06 23:39:51.101: E/AndroidRuntime(22049):  at com.xiangang.qq_client.MainQQActivity.initView(MainQQActivity.java:231)
03-06 23:39:51.101: E/AndroidRuntime(22049):  at com.xiangang.qq_client.MainQQActivity.onCreate(MainQQActivity.java:67)

  expandableListView.setAdapter(userAdapter);然后这行代码在initView()里面;

分析原因,异常告诉我们是空指针异常,那我们就设置断点到进行调试或者直接打印expandableListView的值,发现它为空,不是适配器userAdapter的问题。然后去布局文件查看expandableListView的id,发现也没有错。而且在Activity里也声明了。那么问题出现在哪呢?去到initView()查看代码。因为我是要把ExpandableListView布局到ViewPager其中一个View中,所以我们去看这两行代码:

expandableListView = (ExpandableListView)findViewById(R.id.userlistview);

view2 = layoutInflater.inflate(R.layout.qq_list, null);这个是加载布局文件到view2,我们在view2上显示ExpandableListView。

结果我们发现第一行代码编写在第二行代码之前(代码顺序),这样的话会不会在view2加载R.layout.qq_list之前就使用findVIewById会使expandableListView即使获取到但也是null呢(对于view2来说)?因为我们是把R.layout.qq_list加载到view2中,那么view2就作为了expandableListView的上下文Context,但是我们是在MainActivity中获取,默认的是Context不是view2.这样获取到的expandableListView自然是null值。所以我们把这两代码对调位置,把第一行的Context改成view2.结果如下:

view2 = layoutInflater.inflate(R.layout.qq_list, null);

expandableListView = (ExpandableListView)view2.findViewById(R.id.userlistview);

调试运行,成功!

总结:在使用findViewById()方法时,一定要注意你所使用的控件所在的上下文Context,这样可以避免很多麻烦。

0 0
原创粉丝点击