Android Java动态填充TableRow不能正常工作

时间:2018-10-03 01:37:08

标签: java android dynamic tablelayout tablerow

尝试动态填充TableRow时遇到一些问题。我想要做的是单击导出按钮时,我将编译页眉,页脚和内容,然后完成操作,然后继续导出为PDF。

我在compileContent()中用以下代码填充了TableLayout:

for (int i = 0; i < allCalibrationList.size(); i++) {
        System.out.println("DATA" + allCalibrationList.get(i).getCalibrationName());
        TableRow row = (TableRow) getLayoutInflater().inflate(R.layout.template_calibration_report_summary_item, summaryTableLayout, false);
        TextView textCol1 = row.findViewById(R.id.row_col1);
        TextView textCol2 = row.findViewById(R.id.row_col2);

        textCol1.setText(allCalibrationList.get(i).getCalibrationName());
        textCol2.setText(getString(R.string.report_not_calibrated_label));

        summaryTableLayout.addView(row);
    }
    contentFinished = true;

点击我的导出按钮时:

@Click(R.id.buttonExport)
void buttonExportClicked(View view) {
    FileOutputStream fileOutputStream;
    try {
        while (!headerFinished && !footerFinished && !contentFinished) {
            compileHeader();
            compileContent();
            compileFooter();
        }
        // code to generate pdf
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (Exception e) {
        e.printStackTrace();
    }
}

问题是,当我第一次单击导出按钮时,它进入了compileContent(),并且从我放入for循环中的打印消息中,我设法打印出了数据。但是,tableRow没有显示在导出的PDF中。仅当第二次单击导出按钮时,才会显示tableRow。

但是,当我第二次单击导出按钮时,它没有进入compileContent(),因为我在for循环中设置的已打印消息未打印。任何想法为什么会这样?为什么有数据时tableRow不显示?

感谢进阶!

1 个答案:

答案 0 :(得分:0)

如果我正确理解,您正在做的是更新布局,并通过自定义类将布局转换为PDF。更新布局意味着更新UI,通常不会立即完成更新,因为UI更新排队等待排队,稍后将在UI线程上执行。 (这就是为什么当您的设备忙碌而缓慢时,UI的更新速度不够快的原因)

由于Android充气工具的工作原理,您生成的TableRow可能无法在生成PDF时完成。视图膨胀后,可以使用View.post()运行代码。试试这个:

@Click(R.id.buttonExport)
void buttonExportClicked(View view) {
    FileOutputStream fileOutputStream;
    try {
        if (!headerFinished || !footerFinished || !contentFinished) {
            compileHeader();
            compileContent();
            compileFooter();
        }
        summaryTableLayout.post(new Runnable(){
           @Override
           public void run() {
               // code to generate pdf
           }

        })

    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (Exception e) {
        e.printStackTrace();
    }
}