1

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

GAMA
  • 5,958
  • 14
  • 79
  • 126

3 Answers3

2

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.

MH.
  • 45,303
  • 10
  • 103
  • 116
  • do u know what is the role of `android:layout_weight` in listview_row.xml. I have the idea that it changes the width of column. But how it exactly works? – GAMA Dec 07 '11 at 06:43
  • 1
    It allows you to proportionally place elements inside a LinearLayout. It's been asked on SO many times, but I suggest you read [this short yet clear answer from Anke](http://stackoverflow.com/a/4517358/1029225). By the way, in stead of using a ListView with a LinearLayout creating the 'columns', you could potentially fill up a [GridView](http://developer.android.com/reference/android/widget/GridView.html), which was designed to display 2D data. – MH. Dec 07 '11 at 06:48
  • but gridview comes with the fixed width for all columns i guess – GAMA Dec 07 '11 at 06:51
  • Not necessarily fixed, but equally wide, yes. I initally thought you had placed `layout_weight="1"` for every view in the LinearLayout, which would also result in equally sized columns, but I see I misread. Anyways, good luck on your project. :) – MH. Dec 07 '11 at 07:11
2
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

SurRam
  • 306
  • 3
  • 13
  • yup thnx. List was null when I was passing it. So I need to pass it after populating it. – GAMA Dec 07 '11 at 06:44
0

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

Pratik
  • 30,639
  • 18
  • 84
  • 159
  • but after above line, I'm doing `convertView = inflater.inflate(R.layout.listview_row, null);` . So it will get listview_row.xml na? – GAMA Dec 07 '11 at 06:29
  • yes you'r getting that layout for the listview for it's row layout – Pratik Dec 07 '11 at 07:15