将数据分配给 TableLayout 在启动时实际崩溃应用程序

Assigning Data to TableLayout Pragmatically Crashes app when launching

我在 XML 中有一个 table 布局,其中有一行和三个文本视图。从数组中动态解析 table 中的数据,但是当我启动应用程序时它崩溃了。 这是我的代码

TableLayout historyEntries = (TableLayout)findViewById(R.id.DataTable);
        historyEntries.setStretchAllColumns(true);
        historyEntries.bringToFront();
        for(int i = 0; i < dataArray.length; i++){
            TableRow tr =  (TableRow) findViewById(R.id.datarow);
            TextView c1 = (TextView) findViewById(R.id.TextView1);
            TextView c2 = (TextView) findViewById(R.id.TextView2);
            TextView c3 = (TextView) findViewById(R.id.TextView3);
            c1.setText(dataArray[i]);
            c2.setText(String.valueOf(dataArray[i]));
            c3.setText(String.valueOf(dataArray[i]));
            tr.addView(c1);
            tr.addView(c2);
            tr.addView(c3);
            historyEntries.addView(tr);
        }

错误

java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first.

一个视图只能有一个父视图。根据 findViewById 调用判断,您的一个或所有视图可能有父视图。如果您的观点在 activity 中已经膨胀,只需删除这些行:

tr.addView(c1);
tr.addView(c2);
tr.addView(c3);
historyEntries.addView(tr);

否则,如果您打算添加更多行,可以使用 TableRowTextView 创建单独的布局文件:

for (int i = 0; i < dataArray.length; i++){
    View v = LayoutInflater.from(context).inflate(R.layout.your_table_row, historyEntries, false);
    TableRow tr =  (TableRow) v.findViewById(R.id.datarow);
    TextView c1 = (TextView) v.findViewById(R.id.TextView1);
    TextView c2 = (TextView) v.findViewById(R.id.TextView2);
    TextView c3 = (TextView) v.findViewById(R.id.TextView3);
    c1.setText(dataArray[i]);
    c2.setText(String.valueOf(dataArray[i]));
    c3.setText(String.valueOf(dataArray[i]));
    historyEntries.addView(tr);
}