GAMA
GAMA

Reputation: 5996

nullPointerException in multi column list using hashmap

I already tried references from similar question on SO, but hasn't got the appropriate solution.

I'm trying to fetch the data from a webpage and display it in format consisting of rows having 4 columns.

Data present on webpage:

SBIN ;1916.00;1886.85;1.54@LT ;1315.50;1310.30;0.40@TCS ;1180.00;1178.00;0.17@AXISBANK ;1031.30;1005.95;2.52@MARUTI ;1000.35;992.35;0.81@PNB ;931.90;916.35;1.70@GAIL ;400.00;398.45;0.39@

I want to diaplay it in the form

    SBIN.........1916.00.....1886.85.....1.54

    LT...........1315.50.....1310.30.....0.40  and so on. 

Note that I don't want dots, I want each value to be a separate column within a row.

My Data consists of 7 rows. I have used the code from http://www.technotalkative.com/android-multi-column-listview/

When I run the below code, I get nullPointerException.

Note that when I'm trying values of arrays arr[] and subarr[], they are showing proper content.

CODE UPDATED WITH NULLPOINTEREXCEPTION REMOVED(COMMENTED IN CODE IN MultiCol.java)

MultiCol.java

     package com.multicol;

        import static com.multicol.Constant.FIRST_COLUMN;
        import static com.multicol.Constant.FOURTH_COLUMN;
        import static com.multicol.Constant.SECOND_COLUMN;
        import static com.multicol.Constant.THIRD_COLUMN;

        import java.io.BufferedReader;
        import java.io.InputStream;
        import java.io.InputStreamReader;
        import java.util.ArrayList;
        import java.util.HashMap;

        import org.apache.http.HttpResponse;
        import org.apache.http.client.methods.HttpGet;
        import org.apache.http.impl.client.DefaultHttpClient;

        import android.app.Activity;
        import android.os.AsyncTask;
        import android.os.Bundle;
        import android.util.Log;
        import android.widget.ListView;

        public class MultiCol extends Activity {
            String subarr[] = new String[28];// 7 rows with 4 columns each
            private ArrayList<HashMap<String, String>> list;

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

                ListView lview = (ListView) findViewById(R.id.listview);
                DownloadWebPageTask task = new DownloadWebPageTask();
                task.execute(new String[] { "http://ipad.idealake.com/default.aspx?id=G" });
            }

            private class DownloadWebPageTask extends AsyncTask<String, Void, String> {
                @Override
                protected String doInBackground(String... urls) {
                    String response = "";
                    for (String url : urls) {
                        DefaultHttpClient client = new DefaultHttpClient();
                        HttpGet httpGet = new HttpGet(url);
                        try {
                            HttpResponse execute = client.execute(httpGet);
                            InputStream content = execute.getEntity().getContent();

                            BufferedReader buffer = new BufferedReader(
                                    new InputStreamReader(content));
                            String s = "";
                            while ((s = buffer.readLine()) != null) {
                                response += s;
                            }

                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                    }
                    return response;
                }

                @Override
                protected void onPostExecute(String result) {
                    int sub = result.lastIndexOf('@', result.length() - 1);
                    String s1 = result.substring(0, sub + 2);
                    String temp[];
                    String arr1[] = s1.split("@");
                    String arr[] = new String[7];
                                //To remove 8th element which is null
                    for (int j = 0; j < arr.length; j++) {
                        arr[j] = arr1[j];
                    }

                    for (int i = 0; i < arr.length; i++) {
                        temp = arr[i].split(";");
                        subarr[(4 * i)] = temp[0];
                        subarr[(4 * i) + 1] = temp[1];
                        subarr[(4 * i) + 2] = temp[2];
                        subarr[(4 * i) + 3] = temp[3];
                    }

                    list = new ArrayList<HashMap<String, String>>();

                    for (int i = 0; i < ((subarr.length) / 4); i++) {

                        HashMap<String, String> addList = new HashMap<String, String>();
                         addList.put(FIRST_COLUMN, subarr[(4 * i)]);
                         addList.put(SECOND_COLUMN, subarr[((4 * i) + 1)]);
                         addList.put(THIRD_COLUMN, subarr[((4 * i) + 2)]);
                         addList.put(FOURTH_COLUMN, subarr[((4 * i) + 3)]);

                        list.add(addList);
                    }

  //I was writing these two statements before populating list. So they were giving me  nullPointerException.
     listviewAdapter adapter = new listviewAdapter(this, list);
                lview.setAdapter(adapter);
                }
            }
        }

main.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="vertical" >

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

listviewAdapter.java

          package com.multicol;

        import static com.multicol.Constant.FIRST_COLUMN;
        import static com.multicol.Constant.FOURTH_COLUMN;
        import static com.multicol.Constant.SECOND_COLUMN;
        import static com.multicol.Constant.THIRD_COLUMN;

        import java.util.ArrayList;
        import java.util.HashMap;

        import android.app.Activity;
        import android.view.LayoutInflater;
        import android.view.View;
        import android.view.ViewGroup;
        import android.widget.BaseAdapter;
        import android.widget.TextView;

        public class listviewAdapter extends BaseAdapter {
            public ArrayList<HashMap<String, String>> list;
            Activity activity;

            public listviewAdapter(Activity activity,
                    ArrayList<HashMap<String, String>> list) {
                super();
                this.activity = activity;
                this.list = list;
            }

            @Override
            public int getCount() {
                return list.size();
            }

            @Override
            public Object getItem(int position) {
                return list.get(position);
            }

            @Override
            public long getItemId(int position) {
                return 0;
            }

            private class ViewHolder {
                TextView txtFirst;
                TextView txtSecond;
                TextView txtThird;
                TextView txtFourth;
            }

            @Override
            public View getView(int position, View convertView, ViewGroup parent) {
                ViewHolder holder;
                LayoutInflater inflater = activity.getLayoutInflater();

                if (convertView == null) {
                    convertView = inflater.inflate(R.layout.listview_row, null);
                    holder = new ViewHolder();
                    holder.txtFirst = (TextView) convertView
                            .findViewById(R.id.FirstText);
                    holder.txtSecond = (TextView) convertView
                            .findViewById(R.id.SecondText);
                    holder.txtThird = (TextView) convertView
                            .findViewById(R.id.ThirdText);
                    holder.txtFourth = (TextView) convertView
                            .findViewById(R.id.FourthText);
                    convertView.setTag(holder);
                } else {
                    holder = (ViewHolder) convertView.getTag();
                }

                HashMap<String, String> map = list.get(position);
                holder.txtFirst.setText(map.get(FIRST_COLUMN));
                holder.txtSecond.setText(map.get(SECOND_COLUMN));
                holder.txtThird.setText(map.get(THIRD_COLUMN));
                holder.txtFourth.setText(map.get(FOURTH_COLUMN));

                return convertView;
            }
        }

Constant.java

       package com.multicol;

        public class Constant {
            public static final String FIRST_COLUMN = "First";
            public static final String SECOND_COLUMN = "Second";
            public static final String THIRD_COLUMN = "Third";
            public static final String FOURTH_COLUMN = "Fourth";
        }

listview_row.xml

                    <?xml version="1.0" encoding="utf-8"?>
        <LinearLayout 
            android:id="@+id/relativeLayout1" 
            android:layout_height="fill_parent" 
            android:layout_width="fill_parent"
            xmlns:android="http://schemas.android.com/apk/res/android">

            <TextView
                android:id="@+id/FirstText"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:text="First"
                android:layout_weight="1">
            </TextView>

            <TextView
                android:id="@+id/SecondText"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:text="Second"
                android:layout_weight="2">
            </TextView>

            <TextView
                android:id="@+id/ThirdText"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:text="Third"
                android:layout_weight="1">
            </TextView>

            <TextView
                android:id="@+id/FourthText"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:text="Fourth"
                android:layout_weight="1">
            </TextView>
        </LinearLayout>

LOGCAT

12-07 11:40:19.767: E/AndroidRuntime(2283): FATAL EXCEPTION: main
12-07 11:40:19.767: E/AndroidRuntime(2283): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.multicol/com.multicol.MultiCol}: java.lang.NullPointerException
12-07 11:40:19.767: E/AndroidRuntime(2283):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1955)
12-07 11:40:19.767: E/AndroidRuntime(2283):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1980)
12-07 11:40:19.767: E/AndroidRuntime(2283):     at android.app.ActivityThread.access$600(ActivityThread.java:122)
12-07 11:40:19.767: E/AndroidRuntime(2283):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1146)
12-07 11:40:19.767: E/AndroidRuntime(2283):     at android.os.Handler.dispatchMessage(Handler.java:99)
12-07 11:40:19.767: E/AndroidRuntime(2283):     at android.os.Looper.loop(Looper.java:137)
12-07 11:40:19.767: E/AndroidRuntime(2283):     at android.app.ActivityThread.main(ActivityThread.java:4340)
12-07 11:40:19.767: E/AndroidRuntime(2283):     at java.lang.reflect.Method.invokeNative(Native Method)
12-07 11:40:19.767: E/AndroidRuntime(2283):     at java.lang.reflect.Method.invoke(Method.java:511)
12-07 11:40:19.767: E/AndroidRuntime(2283):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
12-07 11:40:19.767: E/AndroidRuntime(2283):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
12-07 11:40:19.767: E/AndroidRuntime(2283):     at dalvik.system.NativeStart.main(Native Method)
12-07 11:40:19.767: E/AndroidRuntime(2283): Caused by: java.lang.NullPointerException
12-07 11:40:19.767: E/AndroidRuntime(2283):     at com.multicol.listviewAdapter.getCount(listviewAdapter.java:31)
12-07 11:40:19.767: E/AndroidRuntime(2283):     at android.widget.ListView.setAdapter(ListView.java:460)
12-07 11:40:19.767: E/AndroidRuntime(2283):     at com.multicol.MultiCol.onCreate(MultiCol.java:38)
12-07 11:40:19.767: E/AndroidRuntime(2283):     at android.app.Activity.performCreate(Activity.java:4465)
12-07 11:40:19.767: E/AndroidRuntime(2283):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049)
12-07 11:40:19.767: E/AndroidRuntime(2283):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1919)
12-07 11:40:19.767: E/AndroidRuntime(2283):     ... 11 more

ANY HELP APPRICIATED

Upvotes: 1

Views: 493

Answers (3)

SurRam
SurRam

Reputation: 336

Caused by: java.lang.NullPointerException
12-07 11:40:19.767: E/AndroidRuntime(2283):     at com.multicol.listviewAdapter.getCount(listviewAdapter.java:31)

The exception is at the getCount() method. List is null. Instantiate it

 private ArrayList<HashMap<String, String>> list=new ArrayList({});

Give a try

Upvotes: 2

MH.
MH.

Reputation: 45493

You are creating the listViewAdapter in the onCreate of MultiCol and passing in a reference to list. However, at that point list has not been instantiated yet, since that does not happen until your AsyncTask finishes. In other words: you're passing in null, hence the nullpointer exception in LogCat.

To correct this, you'll probably want to move the following two lines of code to the end of the onPostExecute() of your DownloadWebPageTask:

listviewAdapter adapter = new listviewAdapter(this, list);
lview.setAdapter(adapter);

That way you will supply the adapter with an instantiated (non-null) list object.

Upvotes: 2

Pratik
Pratik

Reputation: 30855

I think the error was got for the layout object as you pass the this into the listviewAdapter() constructor and get the layout in that that means you retrieving the current activity layout which was set by setcontentview() and that is your main.xml layout. while for the control or object for the textview for custom list you need to pass that layout resource id when you layout the inflate time. just check that first you got the error where and write the comment on that line in code

LayoutInflater inflater = activity.getLayoutInflater();

I think here you getting the main.xml file layout instead of listview_row.xml

Upvotes: 0

Related Questions