简体   繁体   English

ListView中的NullPointException

[英]NullPointException in ListView

Please have a look at the following code 请看下面的代码

activity_form.xml activity_form.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".Form" >

    <ImageView
        android:id="@+id/logo"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:layout_centerHorizontal="true"
        android:src="@drawable/logo" />

    <TextView
        android:id="@+id/title"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/logo"
        android:layout_marginTop="10dp"
        android:text="@string/title" />

    <ListView
        android:id="@+id/list"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@+id/title"
        android:layout_marginTop="10dp"
        />

</RelativeLayout>

list_layout.xml list_layout.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal" >

    <ImageView
        android:id="@+id/listImage"
        android:layout_width="50dp"
        android:layout_height="50dp"
        android:src="@drawable/star" />

    <TextView
        android:id="@+id/listText"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:paddingLeft="5dp"
        android:paddingTop="10dp"
        android:text="Large Text"
        android:textAppearance="?android:attr/textAppearanceLarge" />

</LinearLayout>

Form.java Form.java

package com.example.callmanager;

import android.os.Bundle;
import android.app.Activity;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;

public class Form extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_form);

        ListView lv = (ListView)findViewById(android.R.id.list);
        String arr[] = getResources().getStringArray(R.array.branch_list);
        lv.setAdapter(new MyAdapter(this,android.R.layout.simple_list_item_1,R.id.listText,arr));
    }

    @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_form, menu);
        return true;
    }

    private class MyAdapter extends ArrayAdapter
    {

        public MyAdapter(Context context, int resource, int textViewResourceId,
                Object[] objects) {
            super(context, resource, textViewResourceId, objects);
            // TODO Auto-generated constructor stub
        }

        @Override
        public View getView(int position, View contentView, ViewGroup parent)
        {
            LayoutInflater inflater = (LayoutInflater)getSystemService(LAYOUT_INFLATER_SERVICE);
            View view = inflater.inflate(R.layout.list_layout, parent,false);

            TextView tv = (TextView)findViewById(R.id.listText);
            ImageView iv = (ImageView)findViewById(R.id.listImage);

            String arr[] = getResources().getStringArray(R.array.branch_list);
            tv.setText(arr[position]);

            if(arr[position].equals("Anuradhapura"))
            iv.setImageResource(R.drawable.star);

            return view;

        }

    }

}

strings.xml strings.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>

    <string name="app_name">Esoft Call Manager</string>
    <string name="hello_world">Hello world!</string>
    <string name="menu_settings">Settings</string>
    <string name="title"><b>Select a Branch To Call</b></string>

    <string-array name="branch_list">
        <item>Anuradhapura</item>
        <item>Avissawella</item>

    </string-array>

</resources>

When I run this code, I get the ' NullPointException '. 当我运行这段代码时,我得到了' NullPointException '。 I am adding the complete log file here 我在这里添加完整的日志文件

02-08 21:04:01.463: D/dalvikvm(490): GC_EXTERNAL_ALLOC freed 43K, 53% free 2551K/5379K, external 1949K/2137K, paused 82ms
02-08 21:04:01.713: D/AndroidRuntime(490): Shutting down VM
02-08 21:04:01.713: W/dalvikvm(490): threadid=1: thread exiting with uncaught exception (group=0x40015560)
02-08 21:04:01.733: E/AndroidRuntime(490): FATAL EXCEPTION: main
02-08 21:04:01.733: E/AndroidRuntime(490): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.callmanager/com.example.callmanager.Form}: java.lang.NullPointerException
02-08 21:04:01.733: E/AndroidRuntime(490):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1647)
02-08 21:04:01.733: E/AndroidRuntime(490):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1663)
02-08 21:04:01.733: E/AndroidRuntime(490):  at android.app.ActivityThread.access$1500(ActivityThread.java:117)
02-08 21:04:01.733: E/AndroidRuntime(490):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:931)
02-08 21:04:01.733: E/AndroidRuntime(490):  at android.os.Handler.dispatchMessage(Handler.java:99)
02-08 21:04:01.733: E/AndroidRuntime(490):  at android.os.Looper.loop(Looper.java:123)
02-08 21:04:01.733: E/AndroidRuntime(490):  at android.app.ActivityThread.main(ActivityThread.java:3683)
02-08 21:04:01.733: E/AndroidRuntime(490):  at java.lang.reflect.Method.invokeNative(Native Method)
02-08 21:04:01.733: E/AndroidRuntime(490):  at java.lang.reflect.Method.invoke(Method.java:507)
02-08 21:04:01.733: E/AndroidRuntime(490):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
02-08 21:04:01.733: E/AndroidRuntime(490):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
02-08 21:04:01.733: E/AndroidRuntime(490):  at dalvik.system.NativeStart.main(Native Method)
02-08 21:04:01.733: E/AndroidRuntime(490): Caused by: java.lang.NullPointerException
02-08 21:04:01.733: E/AndroidRuntime(490):  at com.example.esoftcallmanager.Form.onCreate(Form.java:24)
02-08 21:04:01.733: E/AndroidRuntime(490):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
02-08 21:04:01.733: E/AndroidRuntime(490):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1611)
02-08 21:04:01.733: E/AndroidRuntime(490):  ... 11 more

I am adding the folder structure below if it helps 我在下面添加文件夹结构,如果有帮助

在此处输入图片说明

Why I am getting this error? 为什么我收到此错误? How to solve this? 如何解决呢? Please help! 请帮忙!

try this: 尝试这个:

change this 改变这个

ListView lv = (ListView)findViewById(android.R.id.list);

for: 对于:

ListView lv = (ListView)findViewById(R.id.list);

Normally they use android.R.id.list when class extends a ListActivity 通常,当类扩展ListActivity时,他们使用android.R.id.list

Change: 更改:

    ListView lv = (ListView)findViewById(android.R.id.list);

to

    ListView lv = (ListView)findViewById(R.id.list);

Unless you have an id in your XML in the format of android:id="@android:id/myID" , you don't need to use android.R . 除非您在XML中具有android:id="@android:id/myID"格式的android:id="@android:id/myID" ,否则无需使用android.R Whenever you use one of your own IDs, you can simply use R.id.Whatever 每当您使用自己的ID之一时,您都可以简单地使用R.id.Whatever

The issue is right here. 问题就在这里。 ListView lv = (ListView)findViewById(android.R.id.list); you reference the Id android.R.id.list however in your layout you reference android:id="@+id/list" which creates an Id in the Resources class called list. 您引用Id android.R.id.list但是在布局中引用了android:id="@+id/list" ,它在称为list的Resources类中创建了一个ID。 so you should be referencing R.id.list if you debug you will find that the lv variable is null because it wasn't found because you referenced the wrong id. 因此,如果您进行调试,则应该引用R.id.list ,您会发现lv变量为null,因为未找到它是因为引用了错误的id。

Try this. 尝试这个。

I hope it will solve your NPE. 我希望它能解决您的NPE。

Change it 更改

ListView lv = (ListView)findViewById(android.R.id.list);

to

ListView lv = (ListView)findViewById(R.id.list);

Actually You have defined the list view in the layout activity_form.xml have name list so you need to write the R.id.list . 实际上,您已经在布局activity_form.xml具有名称list定义了列表视图,因此您需要编写R.id.list

如果您使用自己的布局,则无需再编写android.R只需删除android并重新组织您的类

I managed to solve this by my self. 我自己解决了这个问题。 Following edits were required. 需要进行以下编辑。

activity_form.xml activity_form.xml

The "id" of the ListView should be ListView的“ id”应为

android:id="@android:id/list"

Form.java Form.java

It should call the ListView in this way 它应该以这种方式调用ListView

ListView lv = (ListView) findViewById(android.R.id.list);

Inside getView() , the initialization of the TextView and ImageView should be like this getView()内部, TextViewImageView的初始化应像这样

TextView tv = (TextView) view.findViewById(R.id.listText);
ImageView iv = (ImageView) view.findViewById(R.id.listImage);

Note the view.findViewById() part. 注意view.findViewById()部分。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM