Java 为Android表布局动态填充数据
我正在尝试将从SQLite数据库检索的数据加载到Android tableLayout中。这是我的密码: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);
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(这个整数没有列),您也会尝试访问它。再次抱歉,您知道如何以编程方式添加表头吗?