指定的孩子已经有一个父母 - TableLayout

问题描述

我正在将数据从 JSON 获取到我的对象 BalanceSheet 并希望在表格布局中显示数据,但我收到以下错误

指定的孩子已经有一个父母。您必须首先在孩子的父级上调用 removeView()。 // 在这一行

 tableLayout.addView(data_row);

这是我的 XML:

<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/balance_table_SV"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".Activities.BalanceTable">



</ScrollView>

和活动:

public class BalanceTable extends AppCompatActivity {

    ScrollView balance_table_SV;
    ArrayList<BalanceSheet> bsList = new ArrayList<>();
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_balance_table);

        balance_table_SV = findViewById(R.id.balance_table_SV);

        bsList = (ArrayList<BalanceSheet>) getIntent().getSerializableExtra("list");

        TableLayout tableLayout = new TableLayout(this);
        tableLayout.setLayoutParams( new TableLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,ViewGroup.LayoutParams.WRAP_CONTENT));
        tableLayout.setStretchAllColumns(true);
        tableLayout.removeAllViews();

        int rows = bsList.size();

        TableRow headers_row = new TableRow(this);
        TableRow data_row = new TableRow(this);
        for(int i = -1; i < rows; i ++) {



            if (i == -1) {


                // need check
                headers_row.setLayoutParams( new TableLayout.LayoutParams());
                TextView headers = new TextView(this);
                headers.setLayoutParams(new
                        TableRow.LayoutParams(TableRow.LayoutParams.WRAP_CONTENT,TableRow.LayoutParams.WRAP_CONTENT));
                headers.setGravity(Gravity.LEFT);
                headers.setPadding(5,15,15);
                headers.setText("Inv.#");
                headers.setBackgroundColor(Color.parseColor("#f0f0f0"));
                headers_row.addView(headers);
                tableLayout.addView(headers_row);

            }
            else {


                data_row.setLayoutParams( new TableRow.LayoutParams());
                TextView tv1 = new TextView(this);
                tv1.setLayoutParams(new
                        TableRow.LayoutParams(TableRow.LayoutParams.WRAP_CONTENT,TableRow.LayoutParams.WRAP_CONTENT));
                tv1.setText(String.valueOf(bsList.get(i).getName()));
                TextView tv2 = new TextView(this);
                tv2.setLayoutParams(new
                        TableRow.LayoutParams(TableRow.LayoutParams.WRAP_CONTENT,TableRow.LayoutParams.WRAP_CONTENT));
                tv2.setText(String.valueOf(bsList.get(i).getCredit()));
                TextView tv3 = new TextView(this);
                tv3.setLayoutParams(new
                        TableRow.LayoutParams(TableRow.LayoutParams.WRAP_CONTENT,TableRow.LayoutParams.WRAP_CONTENT));
                tv3.setText(String.valueOf(bsList.get(i).getDebt()));
                TextView tv4 = new TextView(this);
                tv4.setLayoutParams(new
                        TableRow.LayoutParams(TableRow.LayoutParams.WRAP_CONTENT,TableRow.LayoutParams.WRAP_CONTENT));
                tv4.setText(String.valueOf(bsList.get(i).getCredit()));

                data_row.addView(tv1);
                data_row.addView(tv2);
                data_row.addView(tv3);
                data_row.addView(tv4);


            }

            tableLayout.addView(data_row);

        }


        balance_table_SV.addView(tableLayout);

    }
}

解决方法

发生这种情况是因为您尝试在 TableLayout 中多次添加相同的视图。当您遍历所有元素时,您必须一次又一次地重新创建 data_row 以将其添加到表格布局中。

else{
    TableRow data_row = new TableRow(this);

    data_row.setLayoutParams( new TableRow.LayoutParams());
    TextView tv1 = new TextView(this);
    tv1.setLayoutParams(new
            TableRow.LayoutParams(TableRow.LayoutParams.WRAP_CONTENT,TableRow.LayoutParams.WRAP_CONTENT));
    tv1.setText(String.valueOf(bsList.get(i).getName()));
    TextView tv2 = new TextView(this);
    tv2.setLayoutParams(new
            TableRow.LayoutParams(TableRow.LayoutParams.WRAP_CONTENT,TableRow.LayoutParams.WRAP_CONTENT));
     tv2.setText(String.valueOf(bsList.get(i).getCredit()));
    TextView tv3= new TextView(this);
    tv3.setLayoutParams(new
            TableRow.LayoutParams(TableRow.LayoutParams.WRAP_CONTENT,TableRow.LayoutParams.WRAP_CONTENT));
    tv3.setText(String.valueOf(bsList.get(i).getDebt()));
    TextView tv4 = new TextView(this);
    tv4.setLayoutParams(new
            TableRow.LayoutParams(TableRow.LayoutParams.WRAP_CONTENT,TableRow.LayoutParams.WRAP_CONTENT));
    tv4.setText(String.valueOf(bsList.get(i).getCredit()));

    data_row.addView(tv1);
    data_row.addView(tv2);
    data_row.addView(tv3);
    data_row.addView(tv4);
    tableLayout.addView(data_row);
}

上面的块将解决问题,因为它每次都会创建TableRow的新对象并将其添加到TableLayout对象

说明: 第二次添加表格行时会产生错误,因为我们尝试添加附加到父项的相同表格行,在这种情况下,我们可以将其视为显示行的表格布局。

那么为什么我们需要创建新的 TableRow 对象: 一个简单的答案是同一个视图项不能在多个地方。