Android TableLayout标题行

好的,所以我得到了这个TableLayout,以及它的全部数据 – 以编程方式添加了所有行。 我在Horizo​​ntalScrollView中有TableLayout,而Horizo​​ntalScrollView又在ScrollView中 – 这使我可以水平和垂直滚动。 我现在要做的是添加一个不会滚动的标题行。 我试过移动东西,以便我的两个滚动视图实际上都在TableLayout内部,并将TableRows添加到Horizo​​ntalScrollView; 我希望能够在滚动视图之外添加标题行。

我能想到的唯一另一件事就是为标题行设置第二个表格布局,但是让列排成一行似乎很难。 有任何想法吗?

一种方法是将TableLayout嵌入另一个TableLayout的行中,并将标题放在前一行中,如下所示。 对齐数据和标题需要将标题View对象的layout_width属性和数据的View对象设置为相同的dip值。 此外,内部TableLayout的View对象的layout_weight属性必须与其对应的标头匹配。 现在,在下面的XML中,我在内部TableLayout中将3个TextView放在一行中以与列标题匹配。 这只是为了说明如何进行对齐。 您可以通过膨胀布局并在运行时添加它来以编程方式填充该数据。

                      

我实际上想出了另一种体面的方式。

通常使用标题行作为第一行,在垂直方向LinearLayout内部构建表。 接下来,以编程方式删除第一行,然后将其作为第一个子项添加到LinearLayout。 这就像一个魅力。

编辑:这也可以工作,而无需指定静态列宽。

我知道问题已经过时了,但这是第一个问题,谷歌给了我,因为我遇到了同样的问题。 既然我认为我find了更好的解决方案,我想分享一下。

想法:将TableLayout(在ScrollView内)放入RelativeLayout并创建一个叠加层,将第一个(标题)行绘制在其他所有内容上。

这是layout.xml:

       

这是代码:

 TableLayout table = (TableLayout)view.findViewById(R.id.table); final TableRow headerRow = new TableRow(context); table.addView(headerRow); table.addView(new TableRow(context)); table.addView(new TableRow(context)); table.addView(new TableRow(context)); RelativeLayout tableWrapper = (RelativeLayout)view.findViewById(R.id.table_wrapper); View fakeHeaderView = new View(context) { @Override public void draw(Canvas canvas) { headerRow.draw(canvas); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { int width = headerRow.getMeasuredWidth(); int height = headerRow.getMeasuredHeight(); widthMeasureSpec = MeasureSpec.makeMeasureSpec(width, MeasureSpec.EXACTLY); heightMeasureSpec = MeasureSpec.makeMeasureSpec(height, MeasureSpec.EXACTLY); super.onMeasure(widthMeasureSpec, heightMeasureSpec); } }; tableWrapper.addView(fakeHeaderView); 

对于那些不满意预先定义你的尺寸的人,我发现了一些对我有用的黑客。

基本上,为标题创建一个单独的表并将其放在主表上,但使用相同的Top对齐,然后创建标题行的两个副本,并在向主表添加一个之后,将另一个添加到标题表并设置子视图的layoutParams到主表的行。

这是我的基本例子。

在你的布局中:

         

然后在添加行时:

  //clear out any views tableLayout.removeAllViews(); floatingRowLayout.removeAllViews(); TableRow[] rows = getTableContentRows() // content of your table TableRow[] titleRows = {getTitleRow(), getTitleRow()}; //two copies of your title row tableLayout.addView(titleRows[0]); // first add the first title to the main table addRows(rows) // add any other rows floatingRowLayout.addView(titleRows[1]); // floatingRowLayout is connected to id/grid_floating_row_layout titleRows[0].setVisibility(View.INVISIBLE); // make the title row added to the main table invisible // Set the layoutParams of the two title rows equal to each other. // Since this is done after the first is added to the main table, they should be the correct sizes. for(int i = 0; i < titleRows[0].getChildCount(); i++) { titleRows[1].getChildAt(i).setLayoutParams(titleRows[0].getChildAt(i).getLayoutParams()); } 

在ScrollView中使用两个tableLayout One,例如给android:stretchColumns="*"

          

然后为ROW创建一个公共视图,最重要的是提到android:layout_width="0dp"

      

现在在活动中

  Tablelayout tableHeading =(TableLayout)findViewById(R.id.tableHead); Tablelayout table =(TableLayout) findViewById(R.id.table_repots); trHeading = (TableRow) getLayoutInflater().inflate(R.layout.table_row_item, null); trHeading.setBackgroundColor(Color.parseColor("#6688AC")); trHeading.setPadding(0,10,0,10); TextView tv; tv = (TextView) trHeading.findViewById(R.id.tbsNo); tv.setText("S.No"); tv = (TextView) trHeading.findViewById(R.id.tbDate); tv.setText("Date"); table.addView(tv);