Android ListView 返回 Null

Posted

技术标签:

【中文标题】Android ListView 返回 Null【英文标题】:Android ListView Returning Null 【发布时间】:2012-06-22 22:04:18 【问题描述】:

我正在设置一个简单的列表视图,还没有填充任何真实数据。但是,当尝试运行测试时,我每次都会得到一个空指针异常。我无法弄清楚是什么导致了问题。错误日志抱怨 setLayoutParams。这是我的代码:

public class Groups extends Activity 

    public void onCreate(Bundle savedInstanceState)
    
        super.onCreate(savedInstanceState);
        setContentView(R.layout.groups_listviews);

        ListView lView = (ListView)findViewById(R.id.list_view_1);
        lView.setLayoutParams(new FrameLayout.LayoutParams(LayoutParams.MATCH_PARENT,
                LayoutParams.MATCH_PARENT, R.layout.groups_listviews_row));
        lView.setCacheColorHint(0);
        lView.setAdapter(null);
        lView.setOnItemClickListener(new OnItemClickListener()
        
            @Override
            public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
                    long arg3) 
                // TODO Auto-generated method stub
            
        );
    

Logcat:

06-20 11:03:27.044: D/dalvikvm(3641): GC_EXTERNAL_ALLOC freed 64K, 43% free 3080K/5379K, external 2357K/2773K, paused 81ms
06-20 11:03:28.388: D/dalvikvm(3641): GC_EXTERNAL_ALLOC freed 6K, 43% free 3096K/5379K, external 4457K/4816K, paused 28ms
06-20 11:03:28.442: D/androidRuntime(3641): Shutting down VM
06-20 11:03:28.442: W/dalvikvm(3641): threadid=1: thread exiting with uncaught exception (group=0x40018560)
06-20 11:03:28.442: E/AndroidRuntime(3641): FATAL EXCEPTION: main
06-20 11:03:28.442: E/AndroidRuntime(3641): java.lang.RuntimeException: Unable to start activity ComponentInfocom/com.main.Groups: java.lang.NullPointerException
06-20 11:03:28.442: E/AndroidRuntime(3641):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1696)
06-20 11:03:28.442: E/AndroidRuntime(3641):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1716)
06-20 11:03:28.442: E/AndroidRuntime(3641):     at android.app.ActivityThread.access$1500(ActivityThread.java:124)
06-20 11:03:28.442: E/AndroidRuntime(3641):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:968)
06-20 11:03:28.442: E/AndroidRuntime(3641):     at android.os.Handler.dispatchMessage(Handler.java:99)
06-20 11:03:28.442: E/AndroidRuntime(3641):     at android.os.Looper.loop(Looper.java:130)
06-20 11:03:28.442: E/AndroidRuntime(3641):     at android.app.ActivityThread.main(ActivityThread.java:3806)
06-20 11:03:28.442: E/AndroidRuntime(3641):     at java.lang.reflect.Method.invokeNative(Native Method)
06-20 11:03:28.442: E/AndroidRuntime(3641):     at java.lang.reflect.Method.invoke(Method.java:507)
06-20 11:03:28.442: E/AndroidRuntime(3641):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
06-20 11:03:28.442: E/AndroidRuntime(3641):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
06-20 11:03:28.442: E/AndroidRuntime(3641):     at dalvik.system.NativeStart.main(Native Method)
06-20 11:03:28.442: E/AndroidRuntime(3641): Caused by: java.lang.NullPointerException
06-20 11:03:28.442: E/AndroidRuntime(3641):     at com.main.Groups.onCreate(Groups.java:23)
06-20 11:03:28.442: E/AndroidRuntime(3641):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
06-20 11:03:28.442: E/AndroidRuntime(3641):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1660)
06-20 11:03:28.442: E/AndroidRuntime(3641):     ... 11 more

回答:我正在访问错误布局文件 (list_view_1) 的列表视图,感谢所有帮助!

【问题讨论】:

【参考方案1】:

如果错误抱怨 setLayoutParams,通常它是 null 方法的接收者(又名 ListView)。

我会检查是否

ListView lView = (ListView)findViewById(R.id.list_view_1);

返回空值。

【讨论】:

这看起来返回null,我会查看list_view_1。 知道了,就是这样,显然我正在访问不同布局文件的列表视图(list_view_1)。感谢您的帮助! 查看空指针异常实际上是一个很好的模式:查看接收对象并考虑它是否可以为空,在大多数情况下,这就是错误消息想要的说;)【参考方案2】:

您将 null 传递给您的 setAdapter() 方法,这将导致 NullPointerException

lView.setAdapter(null);

setAdapter() 需要一个有效的 ListAdapter 作为它的参数。

Here's 一个例子。

如果您确实需要一个空的 ListView,只需将适配器上的数据集设置为空/null,而不是将适配器设置为 null。


编辑:

如果这不是导致问题的原因,那么唯一可以抛出NullPointerException 的其他组件可能是您的ListView

ListView lView = (ListView)findViewById(R.id.list_view_1);

检查您的 xml 中是否确实有一个 ListView 与该 ID 对应。

【讨论】:

+1。只是为了补充这一点。如果您确实需要一个空的 ListView,只需将 Adapter 上的数据集设置为空/null,而不是将适配器设置为 null。 @Kazekage Gaara 我不这么认为我做了 listView 和 setAdapter(null) 并且没有抛出异常。我不认为 setAdapter(null) 是一件好事,我只是说这不是问题的原因。 @Amal 你能用崩溃日志更新你的问题吗?这将帮助我们更多 @Amal 不太可能是这样。 @dymmeh 当我尝试创建列表然后 setAdapter with null 我在谈论 jamesar 问题时,我根本没有崩溃。【参考方案3】:

我想我得到了错误。 new FrameLayout.LayoutParams(width, height, gravity) 的参数,而不是指定重力,而是指定某种布局。

使用 int 更改最后一个参数来指定 Gravity(例如 Gravity.CENTER),您的问题可能会得到解决。

【讨论】:

我最终完全删除了 layoutParams,谢谢! :)

以上是关于Android ListView 返回 Null的主要内容,如果未能解决你的问题,请参考以下文章

java [Android]返回ListView 2时保存滚动位置

Android ListView 返回 Null

Android 自定义 ListView onClickListener 返回 null

返回活动后,Android ListView 不显示传入消息

ArrayList 对象正在返回 java android 中 ListView 上的一行

Android ListView.count vs ListView.size