问题描述
我想向 TableLayout
添加动态行数。我的原始代码定义了 .axml
文件中的表和所有 32 行。行本身相当复杂,具有 ImageView
和另一个嵌入式表格布局。
然后我被要求向表中添加另外 10 行,我认为必须有更好的方法,而不是将 42 个相同布局的表行全部放在 .axml
中,并考虑使其更加数据驱动,因此我如果需要,可以在以后扩展该表。
我最初的想法是创建一个仅包含 .axml
定义的 TableRow
文件,然后在代码中循环遍历我的数据并从 .axml
中扩充行并添加到视图中。我的问题似乎与 .axml
文件本身有关。我的文件的开头是
<?xml version="1.0" encoding="utf-8"?>
<TableRow
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="5dp">
<ImageView
android:id="@+id/ivSign"
android:src="@drawable/sign_menatwork"
android:layout_column="0"
android:layout_width="wrap_content"
android:layout_height="72dp"
android:contentDescription="Men at Work" />
但是这不起作用,因为编译器无法编译它(没有错误只是说编译失败)。我在 LinearLayout
周围添加了 TableRow
,但这没有帮助。
我可以用这种方式定义 TableRow
还是最好转换为 Grid
?
解决方法
我想向 TableLayout 添加动态行数。
在TableLayout中动态添加TableRow,可以看看:
<TableLayout 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:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/tableLayout1"
android:stretchColumns="*">
</TableLayout>
TableLayout tablelayout1;
protected override void OnCreate(Bundle savedInstanceState)
{
base.OnCreate(savedInstanceState);
Xamarin.Essentials.Platform.Init(this,savedInstanceState);
// Set our view from the "main" layout resource
SetContentView(Resource.Layout.activity_main);
tablelayout1 = FindViewById<TableLayout>(Resource.Id.tableLayout1);
tablerow();
}
void tablerow()
{
for(int i=0;i<10;i++)
{
TableLayout.LayoutParams layoutParams = new TableLayout.LayoutParams(LayoutParams.MatchParent,LayoutParams.WrapContent);
TableRow.LayoutParams layoutParams2 = new TableRow.LayoutParams(LayoutParams.MatchParent,LayoutParams.WrapContent);
TextView date = new TextView(this);
//Use TableRow
date.LayoutParameters = layoutParams2;
date.SetBackgroundColor(Color.ParseColor("#FFFFC0"));
date.SetTextSize(Android.Util.ComplexUnitType.Px,(float)30.0);
date.SetTextColor(Color.Black);
date.Text = "date";
date.SetPadding(5,5,5);
TextView name = new TextView(this);
//Use TableRow
name.LayoutParameters = layoutParams2;
name.SetBackgroundColor(Color.ParseColor("#FFFFC0"));
name.SetTextColor(Color.Black);
name.SetTextSize(Android.Util.ComplexUnitType.Px,(float)30.0);
name.Text = "title";
name.SetPadding(5,5);
TableRow tr = new TableRow(this);
//Use TableLayout
tr.LayoutParameters = layoutParams;
tr.AddView(date);
tr.AddView(name);
tablelayout1.AddView(tr,i);
}
}
更新:
首先,创建新的 layout.xml,只有 TableRow。
<?xml version="1.0" encoding="utf-8"?>
<TableRow xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_column="1"
android:text="Open..."
android:padding="3dip"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Ctrl-O"
android:gravity="right"
android:padding="3dip"/>
</TableRow>
然后膨胀 TableRow。
void tablerow()
{
LayoutInflater layoutInflater = (LayoutInflater)GetSystemService(LayoutInflaterService);
TableRow tableRow = (TableRow)layoutInflater.Inflate(Resource.Layout.layout1,null);
tablelayout1.AddView(tableRow);
}
TableLayout tablelayout1;
protected override void OnCreate(Bundle savedInstanceState)
{
base.OnCreate(savedInstanceState);
Xamarin.Essentials.Platform.Init(this,savedInstanceState);
// Set our view from the "main" layout resource
SetContentView(Resource.Layout.activity_main);
tablelayout1 = FindViewById<TableLayout>(Resource.Id.tableLayout1);
tablerow();
}