繁体   English   中英

从mysql到listview检索数据时,应用程序崩溃

[英]App crashes when retrieving data from mysql into listview

我正在尝试从mysql检索数据并将其加载到listview中,但是当我尝试运行它时应用程序崩溃了。我无法解决错误.JSON响应正常,结果显示在浏览器中。请帮助这是MainActivity文件

    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

        }


    });
    }
     }

日志猫看起来像这样

    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

请建议我应该做哪些更改。

由以下原因引起的:java.lang.RuntimeException:您的内容必须具有ID属性为“ android.R.id.list”的ListView。

你有

public class MainActivity extends ListActivity {

接着

setContentView(R.layout.activity_main);

因此,您需要在activity_main.xml具有一个ID为如下的ListView

<ListView
android:id="@android:id/list"

同时删除

lv = (ListView)findViewById(R.id.list);

您可以使用lv = getListView()

报价文件

ListActivity具有默认布局,该布局由位于屏幕中央的单个全屏列表组成。 但是,如果需要,可以通过使用onCreate()中的setContentView()设置自己的视图布局来自定义屏幕布局。 为此,您自己的视图必须包含ID为“ @android:id / list”(或列表,如果在代码中,则为List)的ListView对象

除了这些,您还需要在主ui线程上进行网络操作。 您需要使用ThreadAsyncTask

 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

您将获得NetworkOnMainThreadException

当应用程序尝试在其主线程上执行联网操作时引发的异常。

仅针对面向Honeycomb SDK或更高版本的应用程序抛出此错误。 允许以较早版本的SDK为目标的应用程序在其主事件循环线程上进行联网,但不建议这样做

编辑:

似乎有很多混乱。 人们想要更准确的答案。 所以我会举一个例子

例:

在下面,我们有一个TextView和一个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

在这里MainActivity扩展了ListActivity并且您有setContentView(R.layout.activity_main); activity_main.xml除了listview外还有其他视图。

因此,您需要在XML中使用ID为android:id="@android:id/list"的listview

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

    }

}

快照

查看快照,它具有静态textview。

在此处输入图片说明

现在,我将ID更改如下。 我的布局中仍然有TextView

<ListView
    android:id="@+id/list"

应用程序崩溃

 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'

好吧,如果人们仍然不明白并说不清,并且投票不足,则应在评论中提及原因。 我将很高兴进行编辑。

如果您不希望其他任何视图,那么将显示默认列表,则无需setContentView(R.layout.activity_main); 例如。

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

    }

}

上面没有其他视图,只显示默认列表。

如果您使用的是ListActivity,则您的布局必须具有ID为@android:id/list ListView

activity_main.xml更改您的ListView

<ListView android:id="@android:id/list"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"/>

您也可以使用

lv = getListView();

代替

lv = (ListView)findViewById(R.id.list);

尝试这个..

如下重命名ListView的ID,

<ListView 
    android:id="@android:id/list"
    .
    .

有关更多参考链接

你的ListView初始化如下

ListView lv = getListView();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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