将 TableRow 和广告扩展到现有表格

问题描述

我想向 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();
    }