【问题标题】:Adding TextView for each item in array为数组中的每个项目添加 TextView
【发布时间】:2015-05-02 16:59:32
【问题描述】:

我正在尝试将 sqlite 列拆分为一个数组,然后为数组的每个项目添加一个 TextView。下面是我为数组中的每个项目添加TextView 的函数:

private void BuildTable() {

    sqlcon.open();
    Cursor c = sqlcon.readEntry();

    int rows = c.getCount();
    int cols = c.getColumnCount();
    String[] array;
    c.moveToFirst();

    // outer for loop
    for (int i = 0; i < rows; i++) {

        TableRow row = new TableRow(this);
        row.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT,
                LayoutParams.WRAP_CONTENT));

        // inner for loop
        for (int j = 0; j < cols; j++) {

            TextView tv = new TextView(this);
            tv.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT,
                    LayoutParams.WRAP_CONTENT));
        //    tv.setBackgroundResource(R.drawable.cell_shape);
            tv.setGravity(Gravity.CENTER);
            tv.setTextSize(18);
            tv.setPadding(0, 5, 0, 5);
            array = c.getString(1).split(",");
            for (int k = 0; k < array.length; k++) {
                tv.setText(array[k]);
               row.addView(tv);

           }

        }

        c.moveToNext();

        table_layout.addView(row);

    }
    sqlcon.close();
}

我收到以下错误:

java.lang.RuntimeException:无法启动活动 ComponentInfo{com.logquiz.thequiz.logquiz/com.logquiz.thequiz.logquiz.RulesActivity}:java.lang.IllegalStateException:指定的孩子已经有一个父母。您必须先在孩子的父母上调用 removeView()。

【问题讨论】:

  • 为什么不直接使用ListView

标签: java android android-layout android-activity


【解决方案1】:

问题出在for循环内部

for (int k = 0; k < array.length; k++) {
        tv.setText(array[k]);
        row.addView(tv);
}

在这里,您将相同的TextView 多个添加到同一行实例,这是不允许的。更改您的代码,例如

for (int k = 0; k < array.length; k++) {
        tv.append(array[k]);
}
row.addView(tv);

这样每个 TextView 最多添加一次到当前行

【讨论】:

    【解决方案2】:

    我猜正确的解决方案甚至比 Blackbelt 建议的还要激烈一些。下面的 sn-p 实际上为每一行文本创建一个新的 TextView:

       // inner for loop
        for (int j = 0; j < cols; j++) {
    
          array = c.getString(1).split(",");
          for (int k = 0; k < array.length; k++) {
            TextView tv = new TextView(this);
            tv.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT,
                    LayoutParams.WRAP_CONTENT));
        //    tv.setBackgroundResource(R.drawable.cell_shape);
            tv.setGravity(Gravity.CENTER);
            tv.setTextSize(18);
            tv.setPadding(0, 5, 0, 5);
            tv.setText(array[k]);
            row.addView(tv);
    
          }
        }
    

    Blackbelt 正确识别了该问题:您试图重用相同的 TextView 而不是每次都创建一个新的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-01-21
      • 1970-01-01
      • 2022-01-20
      • 2014-12-03
      • 1970-01-01
      • 1970-01-01
      • 2021-11-02
      相关资源
      最近更新 更多