Java 为Android表布局动态填充数据

Java 为Android表布局动态填充数据,java,android,sql,sqlite,android-tablelayout,Java,Android,Sql,Sqlite,Android Tablelayout,我正在尝试将从SQLite数据库检索的数据加载到Android tableLayout中。这是我的密码: TableLayout table_layout; private SQLiteDatabase mDb; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.tabhost);

我正在尝试将从SQLite数据库检索的数据加载到Android tableLayout中。这是我的密码:

TableLayout table_layout;
private SQLiteDatabase mDb;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.tabhost);

    new Handler().post(new Runnable() { 
        @Override 
        public void run() { 
            DatabaseAdapter dbAdapter = new DatabaseAdapter(Exercise.this); 
            dbAdapter.createDatabase();
            Exercise.this.mDb =  new DataBaseHelper(Exercise.this).getReadableDatabase();  
            table_layout = (TableLayout) findViewById(R.id.TableLayout);
            BuildTable();
        }
    });
}

private void BuildTable() {
    try {
        String sql = "SELECT exerciseType FROM exercise";
        Cursor mCur = mDb.rawQuery(sql, null);
        if (mCur.getCount() != 0) {
            if (mCur.moveToFirst()) {
                do {
                    int rows = mCur.getCount();
                    int cols = mCur.getColumnCount();
                    // 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.setGravity(Gravity.CENTER);
                            tv.setTextSize(18);
                            tv.setPadding(0, 5, 0, 5);

                            tv.setText(mCur.getString(j));
                            row.addView(tv);                            

                        }
                        table_layout.addView(row);
                    }
                } while (mCur.moveToNext());
            }
        }
    } catch (SQLException mSQLException) {
        throw mSQLException;
    }
}
编辑部分

for (int j = 0; j < cols + 1; j++) {
                        TextView tv = new TextView(this);
                        tv.setLayoutParams(new TableRow.LayoutParams(
                                TableLayout.LayoutParams.MATCH_PARENT,
                                LayoutParams.WRAP_CONTENT));
                        tv.setGravity(Gravity.CENTER);
                        tv.setTextSize(18);
                        tv.setPadding(0, 5, 0, 5);
                        tv.setText(mCur.getString(j));

                        row.addView(tv);
                        if(j == cols){
                            CheckBox cb = new CheckBox(this);
                            cb.setLayoutParams(new TableRow.LayoutParams(
                                    TableLayout.LayoutParams.MATCH_PARENT,
                                    LayoutParams.WRAP_CONTENT));
                            cb.setGravity(Gravity.CENTER);
                            cb.setPadding(0, 5, 0, 5);
                            row.addView(cb);
                        }

                    }
private void BuildTable() {
    try {
        String sql = "SELECT * FROM exercise";
        Cursor mCur = mDb.rawQuery(sql, null);
        if (mCur.getCount() != 0) {
            if (mCur.moveToFirst()) {

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

                TextView tv1 = new TextView(this);
                tv1.setLayoutParams(new TableRow.LayoutParams(
                        TableLayout.LayoutParams.MATCH_PARENT,
                        LayoutParams.WRAP_CONTENT));
                tv1.setGravity(Gravity.LEFT);
                tv1.setTextSize(10);
                tv1.setText("ID");
                row.addView(tv1);

                TextView tv2 = new TextView(this);
                tv2.setLayoutParams(new TableRow.LayoutParams(
                        TableLayout.LayoutParams.MATCH_PARENT,
                        LayoutParams.WRAP_CONTENT));
                tv2.setGravity(Gravity.LEFT);
                tv2.setTextSize(10);
                tv2.setText("Exercise Type");
                row.addView(tv2);

                TextView tv3 = new TextView(this);
                tv3.setLayoutParams(new TableRow.LayoutParams(
                        TableLayout.LayoutParams.MATCH_PARENT,
                        LayoutParams.WRAP_CONTENT));
                tv3.setGravity(Gravity.LEFT);
                tv3.setTextSize(10);
                tv3.setText("Amount");
                row.addView(tv3);

                TextView tv4 = new TextView(this);
                tv4.setLayoutParams(new TableRow.LayoutParams(
                        TableLayout.LayoutParams.MATCH_PARENT,
                        LayoutParams.WRAP_CONTENT));
                tv4.setGravity(Gravity.LEFT);
                tv4.setTextSize(10);
                tv4.setText("");
                row.addView(tv4);

                do {
                    int cols = mCur.getColumnCount();

                    for (int j = 0; j < cols + 1; j++) {
                        if (j == cols) {
                            CheckBox cb = new CheckBox(this);
                            cb.setLayoutParams(new TableRow.LayoutParams(
                                    TableLayout.LayoutParams.MATCH_PARENT,
                                    LayoutParams.WRAP_CONTENT));
                            cb.setGravity(Gravity.LEFT);
                            row.addView(cb);
                            final int k = j;
                            cb.setOnClickListener(new View.OnClickListener() {
                                @Override
                                public void onClick(View view) {
                                    exerciseIDList.add(Integer.toString(k));
                                }
                            });
                            break;
                        }

                        TextView tv = new TextView(this);
                        tv.setLayoutParams(new TableRow.LayoutParams(
                                TableLayout.LayoutParams.MATCH_PARENT,
                                LayoutParams.WRAP_CONTENT));
                        tv.setGravity(Gravity.LEFT);
                        tv.setTextSize(10);
                        tv.setText(mCur.getString(j));

                        row.addView(tv);

                    }
                    table_layout.addView(row);
                } while (mCur.moveToNext());
            }
        }
    } catch (SQLException mSQLException) {
        throw mSQLException;
    }

}
private void BuildTable(){
试一试{
String sql=“从练习中选择*”;
游标mCur=mDb.rawQuery(sql,null);
如果(mCur.getCount()!=0){
if(mCur.moveToFirst()){
TableRow row=新的TableRow(本);
行。setLayoutParams(新的LayoutParams(
TableLayout.LayoutParams.MATCH_父级,
LayoutParams.WRAP_内容);
TextView tv1=新的TextView(本);
tv1.setLayoutParams(新的TableRow.LayoutParams(
TableLayout.LayoutParams.MATCH_父级,
LayoutParams.WRAP_内容);
tv1.setGravity(Gravity.LEFT);
tv1.setTextSize(10);
tv1.setText(“ID”);
row.addView(tv1);
TextView tv2=新的TextView(本);
tv2.setLayoutParams(新的TableRow.LayoutParams(
TableLayout.LayoutParams.MATCH_父级,
LayoutParams.WRAP_内容);
tv2.setGravity(Gravity.LEFT);
tv2.setTextSize(10);
tv2.setText(“运动类型”);
row.addView(tv2);
TextView tv3=新的TextView(本);
tv3.setLayoutParams(新的TableRow.LayoutParams(
TableLayout.LayoutParams.MATCH_父级,
LayoutParams.WRAP_内容);
tv3.setGravity(Gravity.LEFT);
tv3.setTextSize(10);
tv3.setText(“金额”);
row.addView(tv3);
TextView tv4=新的TextView(本);
tv4.setLayoutParams(新的TableRow.LayoutParams(
TableLayout.LayoutParams.MATCH_父级,
LayoutParams.WRAP_内容);
tv4.setGravity(Gravity.LEFT);
tv4.setTextSize(10);
tv4.setText(“”);
row.addView(tv4);
做{
int cols=mCur.getColumnCount();
对于(int j=0;j
对于以编程方式添加到TableLayout的视图,您没有使用正确的LayoutParams。创建的TableRows将添加到TableLayout,因此其LayoutParams应为TableLayout类型。LayoutParams:

row.setLayoutParams(new TableLayout.LayoutParams(TableLayout.LayoutParams.MATCH_PARENT, TableLayout.LayoutParams.WRAP_CONTENT));
tv.setLayoutParams(new TableRow.LayoutParams(TableRow.LayoutParams.WRAP_CONTENT, TableRow.LayoutParams.WRAP_CONTENT));
行TextView也是如此,应使用TableRow.LayoutParams:

row.setLayoutParams(new TableLayout.LayoutParams(TableLayout.LayoutParams.MATCH_PARENT, TableLayout.LayoutParams.WRAP_CONTENT));
tv.setLayoutParams(new TableRow.LayoutParams(TableRow.LayoutParams.WRAP_CONTENT, TableRow.LayoutParams.WRAP_CONTENT));

使用适当的
LayoutParams
@Luksprog您是否介意提供一些适合我的情况的示例?您的TableRows具有作为父级的TableLayout,因此它们的LayoutParams应为该类型。因此,当您执行
row.setLayoutParams(新建LayoutParam(…
时,您应该执行
row.setLayoutParams(新建TableLayout.LayoutParam(TableLayout.LayoutParam.MATCH_PARENT…)
。您应该始终使用适当类的LayoutParams。您的TextView也是如此,它们是TableRow的子对象,所以请使用TableRow.LayoutParams。@Luksprog所以基本上我只是添加了一行代码?我需要更改layout.xml中的任何内容吗?是的,只需做我在上面的评论中所说的更改,不做任何修改,等等看看会发生什么。非常感谢!它很有效!但是你有没有办法在每一行中动态添加复选框?因为从我正在做的事情来看,我正在将复选框添加到每一行并column@20Cents使
j
转到
cols+1
,这样您将添加一个额外的列。然后在for循环中插入
if(j==cols){//addthecheckbox}
。这样,你会在每行的末尾都有一个复选框,我假设这就是你想要的,对吗?是的,但我无法从光标窗口读取第0行第2列,该窗口有4行2列。你能帮我检查我编辑的部分吗?@20美分在for循环中写入:
for(int j=0;j
。现在,即使对于j=cols(这个整数没有列),您也会尝试访问它。再次抱歉,您知道如何以编程方式添加表头吗?