将项目迁移到gradle后出现空指针异常

时间:2017-04-08 18:43:27

标签: java android gradle android-gradle

将项目迁移到gradle后,我收到以下错误。我不确定为什么会发生这种情况,这在迁移之前就已经开始了。我尝试将文件复制到一个全新的项目,从一开始就使用grandle build package构建,现在我遇到了这些问题。

Process: com.hospital.headling.hospital, PID: 5243
 java.lang.RuntimeException: Unable to start activity ComponentInfo{com.hospital.headling.hospital/com.hospital.headling.hospital.ListViewActivity}: java.lang.NullPointerException: Attempinvoke virtual method 'void com.hospital.headling.hospital.util.ExpandableHeightGridView.setAdapter(android.widget.ListAdapter)' on a null object reference
 at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2665)
 at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2726)
 at android.app.ActivityThread.-wrap12(ActivityThread.java)
 at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1477)
 at android.os.Handler.dispatchMessage(Handler.java:102)
 at android.os.Looper.loop(Looper.java:154)
 at android.app.ActivityThread.main(ActivityThread.java:6119)
 at java.lang.reflect.Method.invoke(Native Method)
 at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886)
 at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)
 Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void com.hospital.headling.hospital.util.ExpandableHeightGridView.setAdapter(android.widget.ListAdapter)' on a null object reference
at com.hospital.headling.hospital.ListViewActivity.setAdapters(ListViewActivity.java:127)
at com.hospital.headling.hospital.ListViewActivity.onCreate(ListViewActivity.java:61)
at android.app.Activity.performCreate(Activity.java:6679)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1118)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2618)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2726) 
at android.app.ActivityThread.-wrap12(ActivityThread.java) 
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1477) 
atandroid.os.Handler.dispatchMessage(Handler.java:102) 
at android.os.Looper.loop(Looper.java:154) 
at android.app.ActivityThread.main(ActivityThread.java:6119) 
at java.lang.reflect.Method.invoke(Native Method) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776) 

ListViewActivity.java

    package com.hospital.headling.hospital;

    import android.annotation.SuppressLint;
    import android.app.Activity;
    import android.content.Intent;
    import android.os.Bundle;
    import android.view.View;
    import android.widget.AdapterView;
    import android.widget.ArrayAdapter;
    import android.widget.ListView;

    import com.hospital.headling.hospital.adapter.CustomAdapter;
    import com.hospital.headling.hospital.util.ExpandableHeightGridView;

    import org.apache.commons.lang3.ArrayUtils;

    import java.util.ArrayList;

    public class ListViewActivity extends Activity {

        private ExpandableHeightGridView gridView;
        private ListView listView;


        //drawables array for gridview
        private static final int[] osImage = { R.drawable.cardiac, R.drawable.ortho,
                R.drawable.neuro, R.drawable.cancer, R.drawable.doctors, R.drawable.services,
                R.drawable.visit, R.drawable.careers, R.drawable.bills, R.drawable.email, R.drawable.about };

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

            ArrayList<String> menu_links = new ArrayList<>();
            menu_links.add("Cardiac");
            menu_links.add("Orthopedic");
            menu_links.add("Neurosciences");
            menu_links.add("Cancer");
            menu_links.add("Find A Doctor");
            menu_links.add("Medical Services");
            menu_links.add("Patients and Visitors");
            menu_links.add("Careers");
            menu_links.add("Pay Your Bill");
    // Find a reference to the {@link ListView} in the layout
            ListView companiesListView = (ListView) findViewById(R.id.list);

    // Create a new {@link ArrayAdapter} of the menu_links
            ArrayAdapter<String> adapter = new ArrayAdapter<String>(
                    this, android.R.layout.simple_list_item_1, menu_links);


    // Set the adapter on the {@link ListView}
    // so the list can be populated in the user interface
            companiesListView.setAdapter(adapter);


            ///end of stuff


            setAdapters();

            //start
            companiesListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
                public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                    switch (position) {
                /*  case 0:  Intent Cardiac = new Intent(this, Cardiac.class);
                        startActivity(Cardiac);
                        break;
                    case 1:  Intent Orthopedic = new Intent(this, Orthopedic.class);
                        startActivity(newActivity);
                        break;
                    case 2:  Intent Neurosciences = new Intent(this, Neurosciences.class);
                        startActivity(newActivity);
                        break;
                    case 3:  Intent Cancer = new Intent(this, Cancer.class);
                        startActivity(FindADoctor);
                        break;
                    case 4:  Intent newActivity = new Intent(this, reservetickets.class);
                        startActivity(newActivity);
                        break;
                    case 4:  Intent newActivity = new Intent(this, reservetickets.class);
                        startActivity(newActivity);
                        break;
                    case 4:  Intent newActivity = new Intent(this, reservetickets.class);
                        startActivity(newActivity);
                        break;
                    case 4:  Intent newActivity = new Intent(this, reservetickets.class);
                        startActivity(newActivity);
                        break; */
                        case 9:
                            Intent ContactForm = new Intent(ListViewActivity.this, com.hospital.headling.hospital.ContactForm.class);
                            startActivity(ContactForm);
                            break;
                    }
                }
            });
            //finish

        }

        /**
         * set footer for listview (it's a gridview)
         */
        @SuppressLint("InflateParams")
        private void addGridViewAsListViewFooter() {
            View footer = (View) getLayoutInflater().inflate(R.layout.layout_gridview, null);
            listView.addFooterView(footer);

            gridView = (ExpandableHeightGridView) footer.findViewById(R.id.gridview);

            // set expand to show all gridview rows
            gridView.setExpanded(true);
        }


        /**
         * set adapters for list view and gridview
         */
        private void setAdapters() {
            // convert int array to Integer array by apache common lang library
            Integer[] osImageList = ArrayUtils.toObject(osImage);

            // set gridview adapter
            CustomAdapter gridViewAdapter = new CustomAdapter(this, R.layout.item_grid, R.id.image, osImageList);

            gridView.setAdapter(gridViewAdapter);

        }
    }

ExampleHeightGridView.java

package com.hospital.headling.hospital.util;

import android.content.Context;
import android.util.AttributeSet;
import android.view.ViewGroup;
import android.widget.GridView;

public class ExpandableHeightGridView extends GridView {

    boolean expanded = false;

    public ExpandableHeightGridView(Context context) {
        super(context);
    }

    public ExpandableHeightGridView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public ExpandableHeightGridView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    public boolean isExpanded() {
        return expanded;
    }

    @Override
    public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        if (isExpanded()) {
            // Calculate entire height by providing a very large height hint.
            // MEASURED_SIZE_MASK represents the largest height possible.
            int expandSpec = MeasureSpec.makeMeasureSpec(MEASURED_SIZE_MASK, MeasureSpec.AT_MOST);
            super.onMeasure(widthMeasureSpec, expandSpec);

            ViewGroup.LayoutParams params = getLayoutParams();
            params.height = getMeasuredHeight();
        } else {
            super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        }
    }

    public void setExpanded(boolean expanded) {
        this.expanded = expanded;
    }
}

layout_gridview.xml

<LinearLayout 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"
    android:orientation="vertical" >



    <com.healinghospital.healinghospital.util.ExpandableHeightGridView
        android:id="@+id/gridview"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:horizontalSpacing="10dp"
        android:verticalSpacing="10dp"
        android:numColumns="6"
        android:stretchMode="columnWidth"/>

    <!--<TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="10dp"
        android:background="#000099"
        android:text="@string/corporation"
        android:textColor="@android:color/white" /> -->

    <TextView
        android:id="@+id/list"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="10dp"
        android:background="#000099"
        android:textColor="@android:color/white" />


</LinearLayout>

activity_mail.xml

<LinearLayout 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"
    android:orientation="vertical">

    <ListView
        android:id="@+id/list"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>

</LinearLayout>

CustomAdapter.java

package com.hospital.headling.hospital.adapter;
import android.app.Activity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ImageView;

import com.hospital.headling.hospital.R;

public class CustomAdapter extends ArrayAdapter<Integer> {

    private Activity activity;

    public CustomAdapter(Activity activity, int resource, int textViewResourceId, Integer[] osimage) {
        super(activity, resource, textViewResourceId, osimage);
        this.activity = activity;
    }



    @Override
    public View getView(int position, View convertView, ViewGroup parent) {

        ViewHolder holder = null;

        // inflate layout from xml
        LayoutInflater inflater = (LayoutInflater) activity
            .getSystemService(Activity.LAYOUT_INFLATER_SERVICE);

        // If holder not exist then locate all view from UI file.
        if (convertView == null) {
            // inflate UI from XML file
            convertView = inflater.inflate(R.layout.item_grid, parent, false);
            // get all UI view
            holder = new ViewHolder(convertView);
            // set tag for holder
            convertView.setTag(holder);
        } else {
            // if holder created, get tag from view
            holder = (ViewHolder) convertView.getTag();
        }

        holder.image.setImageResource(getItem(position));

        return convertView;
    }

    private class ViewHolder {
        private ImageView image;

        public ViewHolder(View v) {
            image = (ImageView)v.findViewById(R.id.image);
        }
    }
}

1 个答案:

答案 0 :(得分:2)

您永远不会调用初始化addGridViewAsListViewFooter()的方法ExpandableHeightGridView

gridView = (ExpandableHeightGridView) footer.findViewById(R.id.gridview);

所以在这一行:

gridView.setAdapter(gridViewAdapter);

此处gridView永远不会被初始化,因此它会提供NullPointerException

在调用setAdapter()

之前初始化它