Android layout - How to implement a fixed/freezed header and column

前端 未结 7 1466
轮回少年
轮回少年 2020-12-24 07:46

I would like to create a table-like view that contains a large number of columns (7-10) while the headers row is always visible (even when scrolling down) and the first colu

7条回答
  •  被撕碎了的回忆
    2020-12-24 08:23

    I would go with TableLayout populated by TableRow's.

    The following code demonstrates how to achieve that.

    package com.test;
    
    import android.app.Activity;
    import android.graphics.Color;
    import android.os.Bundle;
    import android.view.Gravity;
    import android.widget.TableLayout;
    import android.widget.TableRow;
    import android.widget.TableRow.LayoutParams;
    import android.widget.TextView;
    
    public class TableLayoutTest extends Activity {
    
        /** Called when the activity is first created. */
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.table_layout);
    
            TableRow.LayoutParams wrapWrapTableRowParams = new TableRow.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
            int[] fixedColumnWidths = new int[]{20, 20, 20, 20, 20};
            int[] scrollableColumnWidths = new int[]{20, 20, 20, 30, 30};
            int fixedRowHeight = 50;
            int fixedHeaderHeight = 60;
    
            TableRow row = new TableRow(this);
            //header (fixed vertically)
            TableLayout header = (TableLayout) findViewById(R.id.table_header);
            row.setLayoutParams(wrapWrapTableRowParams);
            row.setGravity(Gravity.CENTER);
            row.setBackgroundColor(Color.YELLOW);
            row.addView(makeTableRowWithText("col 1", fixedColumnWidths[0], fixedHeaderHeight));
            row.addView(makeTableRowWithText("col 2", fixedColumnWidths[1], fixedHeaderHeight));
            row.addView(makeTableRowWithText("col 3", fixedColumnWidths[2], fixedHeaderHeight));
            row.addView(makeTableRowWithText("col 4", fixedColumnWidths[3], fixedHeaderHeight));
            row.addView(makeTableRowWithText("col 5", fixedColumnWidths[4], fixedHeaderHeight));
            header.addView(row);
            //header (fixed horizontally)
            TableLayout fixedColumn = (TableLayout) findViewById(R.id.fixed_column);
            //rest of the table (within a scroll view)
            TableLayout scrollablePart = (TableLayout) findViewById(R.id.scrollable_part);
            for(int i = 0; i < 10; i++) {
                TextView fixedView = makeTableRowWithText("row number " + i, scrollableColumnWidths[0], fixedRowHeight);
                fixedView.setBackgroundColor(Color.BLUE);
                fixedColumn.addView(fixedView);
                row = new TableRow(this);
                row.setLayoutParams(wrapWrapTableRowParams);
                row.setGravity(Gravity.CENTER);
                row.setBackgroundColor(Color.WHITE);
                row.addView(makeTableRowWithText("value 2", scrollableColumnWidths[1], fixedRowHeight));
                row.addView(makeTableRowWithText("value 3", scrollableColumnWidths[2], fixedRowHeight));
                row.addView(makeTableRowWithText("value 4", scrollableColumnWidths[3], fixedRowHeight));
                row.addView(makeTableRowWithText("value 5", scrollableColumnWidths[4], fixedRowHeight));
                scrollablePart.addView(row);
            }
    
        }
    
    
        //util method
        private TextView recyclableTextView;
    
        public TextView makeTableRowWithText(String text, int widthInPercentOfScreenWidth, int fixedHeightInPixels) {
            int screenWidth = getResources().getDisplayMetrics().widthPixels;
            recyclableTextView = new TextView(this);
            recyclableTextView.setText(text);
            recyclableTextView.setTextColor(Color.BLACK);
            recyclableTextView.setTextSize(20);
            recyclableTextView.setWidth(widthInPercentOfScreenWidth * screenWidth / 100);
            recyclableTextView.setHeight(fixedHeightInPixels);
            return recyclableTextView;
        }
    
    }
    

    Header is the part that doesn't scroll vertically; that's the reason you need to set fixed width on columns. As of the first column that you don't want to scroll, you'll have to set a fixed height on rows for that purpose.

    Here's the layout XML

    
    
        
        
            
                
                
                    
                
            
        
    
    

    And the output looks like this when just loaded

    enter image description here

    and like this when scrolled to the right and to the bottom

    enter image description here

提交回复
热议问题