简体   繁体   中英

App crashes when retrieving data from mysql into listview

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.

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.

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);

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();

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM