Reputation: 5996
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.
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
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
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
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