Reputation: 199
I am trying to retrieve data from mysql and load into listview.But the app crashes when I try to run it.I am not able to solve the errors.The JSON response is working fine and the results are displayed in the browser.Please help.This is the MainActivity file
package com.example.triallistview;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import android.app.ListActivity;
import android.net.ParseException;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.Toast;
public class MainActivity extends ListActivity {
int ct_id;
String[] ct_name = null;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
String result = null;
InputStream is = null;
StringBuilder sb = null;
ListView lv;
lv = (ListView)findViewById(R.id.list);
// http post
try {
HttpClient httpclient = new DefaultHttpClient();
HttpPost httppost = new HttpPost("http://127.0.0.1/example/city.php");
// httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
HttpResponse response = httpclient.execute(httppost);
HttpEntity entity = response.getEntity();
is = entity.getContent();
} catch (Exception e) {
Log.e("log_tag", "Error in http connection" + e.toString());
}
// convert response to string
try {
BufferedReader reader = new BufferedReader(new InputStreamReader(
is, "iso-8859-1"), 8);
sb = new StringBuilder();
sb.append(reader.readLine() + "\n");
String line = "0";
while ((line = reader.readLine()) != null) {
sb.append(line + "\n");
}
is.close();
result = sb.toString();
} catch (Exception e) {
Log.e("log_tag", "Error converting result " + e.toString());
}
// paring data
JSONArray jArray;
try {
jArray = new JSONArray(result);
JSONObject json_data = null;
ct_name = new String[jArray.length()];
for (int i = 0; i < jArray.length(); i++) {
json_data = jArray.getJSONObject(i);
ct_id = json_data.getInt("CITY_ID");
ct_name[i] = json_data.getString("CITY_NAME");
}
} catch (JSONException e1) {
Toast.makeText(getBaseContext(), "No City Found", Toast.LENGTH_LONG)
.show();
} catch (ParseException e1) {
e1.printStackTrace();
}
lv = getListView();
lv.setAdapter(new ArrayAdapter<String>(this,
android.R.layout.simple_list_item_1, ct_name));
lv.setTextFilterEnabled(true);
lv.setOnItemClickListener(new OnItemClickListener() {
public void onItemClick(int position, long id) {
// When clicked, show a toast with the TextView text
Toast.makeText(getApplicationContext(),
ct_name[position] + " wasClicked", Toast.LENGTH_SHORT)
.show();
}
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
long arg3) {
// TODO Auto-generated method stub
}
});
}
}
The logcat looks like this
03-25 02:42:03.195: E/AndroidRuntime(2380): FATAL EXCEPTION: main
03-25 02:42:03.195: E/AndroidRuntime(2380): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.triallistview/com.example.triallistview.MainActivity}: java.lang.RuntimeException: Your content must have a ListView whose id attribute is 'android.R.id.list'
03-25 02:42:03.195: E/AndroidRuntime(2380): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2211)
03-25 02:42:03.195: E/AndroidRuntime(2380): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2261)
03-25 02:42:03.195: E/AndroidRuntime(2380): at android.app.ActivityThread.access$600(ActivityThread.java:141)
03-25 02:42:03.195: E/AndroidRuntime(2380): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1256)
03-25 02:42:03.195: E/AndroidRuntime(2380): at android.os.Handler.dispatchMessage(Handler.java:99)
03-25 02:42:03.195: E/AndroidRuntime(2380): at android.os.Looper.loop(Looper.java:137)
03-25 02:42:03.195: E/AndroidRuntime(2380): at android.app.ActivityThread.main(ActivityThread.java:5103)
03-25 02:42:03.195: E/AndroidRuntime(2380): at java.lang.reflect.Method.invokeNative(Native Method)
03-25 02:42:03.195: E/AndroidRuntime(2380): at java.lang.reflect.Method.invoke(Method.java:525)
03-25 02:42:03.195: E/AndroidRuntime(2380): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)
03-25 02:42:03.195: E/AndroidRuntime(2380): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
03-25 02:42:03.195: E/AndroidRuntime(2380): at dalvik.system.NativeStart.main(Native Method)
03-25 02:42:03.195: E/AndroidRuntime(2380): Caused by: java.lang.RuntimeException: Your content must have a ListView whose id attribute is 'android.R.id.list'
03-25 02:42:03.195: E/AndroidRuntime(2380): at android.app.ListActivity.onContentChanged(ListActivity.java:243)
03-25 02:42:03.195: E/AndroidRuntime(2380): at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:270)
03-25 02:42:03.195: E/AndroidRuntime(2380): at android.app.Activity.setContentView(Activity.java:1895)
03-25 02:42:03.195: E/AndroidRuntime(2380): at com.example.triallistview.MainActivity.onCreate(MainActivity.java:34)
03-25 02:42:03.195: E/AndroidRuntime(2380): at android.app.Activity.performCreate(Activity.java:5133)
03-25 02:42:03.195: E/AndroidRuntime(2380): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
03-25 02:42:03.195: E/AndroidRuntime(2380): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2175)
03-25 02:42:03.195: E/AndroidRuntime(2380): ... 11 more
Please suggest me what changes should I do.
Upvotes: 0
Views: 442
Reputation: 133560
Caused by: java.lang.RuntimeException: Your content must have a ListView whose id attribute is 'android.R.id.list'
You have
public class MainActivity extends ListActivity {
And then
setContentView(R.layout.activity_main);
So you need to have a ListView in activity_main.xml
with id as below
<ListView
android:id="@android:id/list"
Also remove
lv = (ListView)findViewById(R.id.list);
You can use lv = getListView()
Quoting docs
ListActivity has a default layout that consists of a single, full-screen list in the center of the screen. However, if you desire, you can customize the screen layout by setting your own view layout with setContentView() in onCreate(). To do this, your own view MUST contain a ListView object with the id "@android:id/list" (or list if it's in code)
Apart of all these you are doing Network operation on the main ui thread. You need to use a Thread
or AsyncTask
.
HttpClient httpclient = new DefaultHttpClient();
HttpPost httppost = new HttpPost("http://127.0.0.1/example/city.php");
// httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
HttpResponse response = httpclient.execute(httppost); // must be in a thread
You will get NetworkOnMainThreadException
.
The exception that is thrown when an application attempts to perform a networking operation on its main thread.
This is only thrown for applications targeting the Honeycomb SDK or higher. Applications targeting earlier SDK versions are allowed to do networking on their main event loop threads, but it's heavily discouraged
Edit:
Seems there is lot of confusion. People want more accurate answer. SO i will post an example
Example:
In the below we have a TextView
and a ListView
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.example.testall.MainActivity"
tools:ignore="MergeRootFrame" >
<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:layout_marginLeft="150dp"
android:layout_marginTop="22dp"
android:text="Static TextView" />
<ListView
android:id="@android:id/list"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_below="@+id/textView1"
android:layout_marginLeft="12dp"
android:layout_marginTop="12dp" >
</ListView>
</RelativeLayout>
MainActivity.java
Here MainActivity
extends ListActivity
and you have setContentView(R.layout.activity_main);
. activity_main.xml
has other views apart from listview.
So you need a listview with id android:id="@android:id/list"
in your xml
public class MainActivity extends ListActivity {
String[] array ={"A","B","C","D","E"};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ListView lv = getListView();
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,array);
lv.setAdapter(adapter);
}
}
Snap
See the snap it has a static textview.
Now i changed the id as below. I still had the TextView
in my layout nothing else changed
<ListView
android:id="@+id/list"
App crashes
03-25 04:16:02.022: E/AndroidRuntime(1275): Caused by: java.lang.RuntimeException: Your content must have a ListView whose id attribute is 'android.R.id.list'
Well if people still don't understand and say its not clear and downvote they should mention the reason in the comment. I will be happy to edit.
If you don't want any other views other then the default list displayed there is no need for setContentView(R.layout.activity_main);
. For example.
public class MainActivity extends ListActivity {
String[] array ={"A","B","C","D","E"};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,array);
setListAdapter(adapter);
}
}
In the above there are no other views except the default list displayed.
Upvotes: 3
Reputation: 24853
Try this..
Rename the id of your ListView like below,
<ListView
android:id="@android:id/list"
.
.
For more Reference Link
Do your ListView
initialize like below
ListView lv = getListView();
Upvotes: 1
Reputation: 33238
If you are using ListActivity then your layout must have ListView which id is @android:id/list
Change your ListView
in activity_main.xml
<ListView android:id="@android:id/list"
android:layout_width="fill_parent"
android:layout_height="fill_parent"/>
You can also use
lv = getListView();
instead of
lv = (ListView)findViewById(R.id.list);
Upvotes: 1