开发者

android - ArrayAdapter.createViewFromResource(int, View, ViewGroup, int) line: 355 NullPointerException

I'm setting an ArrayAdapter and I get the following error:

 Thread [<1> main] (Suspended (exception NullPointerException)) 
ArrayAdapter.createViewFromResource(int, View, ViewGroup, int) line: 355    
ArrayAdapter.getView(int, View, ViewGroup) line: 323    
ListView(AbsListView).obtainView(int, boolean[]) line: 1294 
ListView.measureHeightOfChildren(int, int, int, int, int) line: 1198    

My symptomremedyActivity.java looks like:

    setContentView(R.layout.symptomremedy);
    ListView remedyList = (ListView) findViewById(R.id.ListView_SymptomRemedy);
    remedyList.setTextFilterEnabled(true);
    ArrayAdapter<String> adapt = new ArrayAdapter<String>(this, R.layout.menu_item, remedyArray);
    remedyList.setAdapter(adapt);

and my symptomremedy.xml layout looks like:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<Button
android:id="@+id/Button_BACK"
android:layout_width="wrap_content"
android:layout_height="@dimen/menu_button_height"
android:layout_alignTop="@+id/Button_BACK"
android:layout_below="@+id/ImageView_MenuHeader"
android:textSize="@dimen/menu_button_text_size"
android:text="@string/back"></Button>

<ListView
        android:layout_height="wrap_content"
        android:id="@+id/ListView_SymptomRemedy"
        android:layout_width="fill_parent"
        android:background="@color/menu_white"
        android:divider="@drawable/straight_divider"
        android:listSelector="@drawable/textured"
        android:layout_alignParentTop="true"></ListView>

</LinearLayout>

and menu_item.xml layout looks like:

<TextView
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:textSize="@dimen/menu_item_size"
android:text="test string"
android:textColor="@color/menu_black"
android:layout_height="fill_parent"
 />

I've done something similar in other 开发者_如何学GoActivities with no problems, so I can't figure out why there is a problem here. All of the fields involved are non-null, i.e. remedyArray, etc. Anyone have any idea what the problem is?


Turns out the problem was in the way I was creating the array for the ArrayAdapter. Previously the code I had was:

String remedyArray[] = new String[30];

When I changed the code to:

    String remedyArray[] = new String[30];
    for ( int i = 0; i< 30; i++){
            remedyArray[i] = "";
    }

everything worked. I don't completely understand why, but it appeared that initializing the array with values did the trick. I guess one of the uniquenesses of Java is that when an array is created, the entries contain null, and I think it was those null values that were causing the problem.


The NullPointerException in

ArrayAdapter.createViewFromResource

suggests that the problem is coming from

R.layout.menu_item

If this file exists under /res/layout/, check that it's registered in R.java

Also, are you using a custom ArrayAdapter? If so, please update the question with the code.

If you are not using a custom ArrayAdapter, try adding an identifier to the TextView in menu_item. If you are not overriding getView, Android will try to fill a TextView in the resourceId (menu_item.xml) with the data in remedyList. I've never done this, but you may need to specify the TextView id by using this constructor:

ArrayAdapter(Context context, int resource, int textViewResourceId, List<T> objects)

Check ArrayAdapter constructors.


My problem was that the custom item layout and the dropdown item layout weren't using the same Id for the main textview; basically because I wanted to create a custom item, but maintain the default dropdown item.

the id in textViewResourceId must be the same for both views.

ArrayAdapter(Context context, int resource, int textViewResourceId, List<T> objects)

Creating a custom dropdown item with the same textview id solved the problem.


Sorry for digging up this question but I came across the issue today and I understood why this happens.

If you statically allocate some space for a newly created array (ie. String[] array = new String[80]) you have to make sure that you fill all the 81 places of the array. Because if you do not they will be filled with null values thus causing the NullPointerException.

When you filled the array with empty strings you basically found a work-around over this.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜