Android 如何通过解析json数据动态添加表视图
我正在将一个函数调用到线程中,并将这些对象放到tableView中,但我正在接受非法状态异常。我无法解决为什么?下面是我负责调用函数的代码:Android 如何通过解析json数据动态添加表视图,android,json,tableview,Android,Json,Tableview,我正在将一个函数调用到线程中,并将这些对象放到tableView中,但我正在接受非法状态异常。我无法解决为什么?下面是我负责调用函数的代码: runOnUiThread(new Runnable() { fillTable(jArray); } }); 其功能是: pr
runOnUiThread(new Runnable() {
fillTable(jArray);
}
});
其功能是:
private void fillTable(JSONArray jArray){
TextView t1v = new TextView(ReportAllActivity.this);
TextView t2v = new TextView(ReportAllActivity.this);
TextView t3v = new TextView(ReportAllActivity.this);
TextView t4v = new TextView(ReportAllActivity.this);
TextView t5v = new TextView(ReportAllActivity.this);
TextView t6v = new TextView(ReportAllActivity.this);
ArrayList<JSONObject> listdata = new ArrayList<JSONObject>();
for(int i = 0 ; i < jArray.length() ; i++)
{
listdata.add(jArray.optJSONObject(i));
}
int i = jArray.length()-1;
while( i >= 0 )
{
try {
json_data = listdata.get(i);
//json_data = jArray.getJSONObject(i);
TableRow tbrow = new TableRow(ReportAllActivity.this);
t1v.setText(json_data.getString("heat"));
t1v.setTextColor(Color.WHITE);
t1v.setGravity(Gravity.CENTER);
tbrow.addView(t1v);
t2v.setText(json_data.getString("oc_count"));
t2v.setTextColor(Color.WHITE);
t2v.setGravity(Gravity.CENTER);
tbrow.addView(t2v);
t3v.setText(json_data.getString("who"));
t3v.setTextColor(Color.WHITE);
t3v.setGravity(Gravity.CENTER);
tbrow.addView(t3v);
t4v.setText(json_data.getString("alarm"));
t4v.setTextColor(Color.WHITE);
t4v.setGravity(Gravity.CENTER);
tbrow.addView(t4v);
t5v.setText(json_data.getString("do_duration"));
t5v.setTextColor(Color.WHITE);
t5v.setGravity(Gravity.CENTER);
tbrow.addView(t5v);
t6v.setText(json_data.getString("input_time"));
t6v.setTextColor(Color.WHITE);
t6v.setGravity(Gravity.CENTER_HORIZONTAL);
tbrow.addView(t6v);
listdata.remove(i);
i--;
reportTable.addView(tbrow);
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
如何解决此问题?请提前感谢。您的问题是因为在任何地方都使用相同的TextView而出现的
tbrow.addView(t1v)代码>
您在每次迭代中都添加此视图。但这应该是不同的观点。
您应该在算法的每次迭代中创建不同的文本视图。如果每次创建时都创建了文本视图,则由于数据太多,程序会出现OutOfMemory异常。我该如何处理?您应该设法优化程序内存管理。首先,您应该尝试从xml文件中膨胀TextView。类似这样的内容:View footer=inflater.inflate(R.layout.footer\u lv\u事件,null)代码>如果程序仍然失败,也许你应该只显示用户界面的一部分(所有视图的一半)。我想你应该问一个新问题。
09-07 16:28:57.142: E/AndroidRuntime(696): FATAL EXCEPTION: main
09-07 16:28:57.142: E/AndroidRuntime(696): java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first.
09-07 16:28:57.142: E/AndroidRuntime(696): at android.view.ViewGroup.addViewInner(ViewGroup.java:1970)
09-07 16:28:57.142: E/AndroidRuntime(696): at android.view.ViewGroup.addView(ViewGroup.java:1865)
09-07 16:28:57.142: E/AndroidRuntime(696): at android.view.ViewGroup.addView(ViewGroup.java:1822)
09-07 16:28:57.142: E/AndroidRuntime(696): at android.view.ViewGroup.addView(ViewGroup.java:1802)
09-07 16:28:57.142: E/AndroidRuntime(696): at com.example.hsvarge.ReportAllActivity.fillTable(ReportAllActivity.java:263)
09-07 16:28:57.142: E/AndroidRuntime(696): at com.example.hsvarge.ReportAllActivity.access$1(ReportAllActivity.java:192)
09-07 16:28:57.142: E/AndroidRuntime(696): at com.example.hsvarge.ReportAllActivity$3$1.run(ReportAllActivity.java:170)
09-07 16:28:57.142: E/AndroidRuntime(696): at android.os.Handler.handleCallback(Handler.java:587)
09-07 16:28:57.142: E/AndroidRuntime(696): at android.os.Handler.dispatchMessage(Handler.java:92)
09-07 16:28:57.142: E/AndroidRuntime(696): at android.os.Looper.loop(Looper.java:123)
09-07 16:28:57.142: E/AndroidRuntime(696): at android.app.ActivityThread.main(ActivityThread.java:4627)
09-07 16:28:57.142: E/AndroidRuntime(696): at java.lang.reflect.Method.invokeNative(Native Method)
09-07 16:28:57.142: E/AndroidRuntime(696): at java.lang.reflect.Method.invoke(Method.java:521)
09-07 16:28:57.142: E/AndroidRuntime(696): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
09-07 16:28:57.142: E/AndroidRuntime(696): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
09-07 16:28:57.142: E/AndroidRuntime(696): at dalvik.system.NativeStart.main(Native Method)