[英]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.