簡體   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