[英]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線程上進行網絡操作。 您需要使用Thread
或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
您將獲得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.