首页 > 其他分享 >Android 使用TableLayout动态绘制表格

Android 使用TableLayout动态绘制表格

时间:2022-11-14 11:24:17浏览次数:52  
标签:DataItem 表格 add TableLayout new Android dataItems String

第一步:在layout文件中添加TableLayout

在layout文件中添加TableLayout组件,其中添加两行TableRow,绘制表格标题和表格列的名称。

在需要分格的TableRow中添加LinearLayout, , 再在LinearLayout中添加TextView, 便于使用weight属性调整每一格的宽度。

其中android:stretchColumns="*"属性使每一行内的控件自动拉伸填充表格行。

由于TableLayout没有设置边框颜色的属性, 于是使用android:background="@color/black"将背景设置为想要设置的边框颜色, 然后在TableRow中添加背景填充, 使得TableLayout的背景颜色以margin的形式显示出来, 形成表格边框的样式。

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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"
    tools:context=".MainActivity">

    <TableLayout
        android:id="@+id/tableLayout"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_margin="20dp"
        android:background="@color/black"
        android:stretchColumns="*">

        <TableRow
            android:id="@+id/tRowTitle"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_margin="2dp"
            android:background="@color/white">

            <TextView
                android:id="@+id/tvTableTitle"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:gravity="center"
                android:padding="10dp"
                android:text="TableTitle"
                android:textSize="20sp" />
        </TableRow>

        <TableRow
            android:id="@+id/tRowColumTitle"
            android:layout_width="match_parent"
            android:layout_height="match_parent">

            <LinearLayout android:orientation="horizontal">

                <TextView
                    android:id="@+id/tvColumNo"
                    android:layout_width="0dp"
                    android:layout_height="wrap_content"
                    android:layout_marginLeft="2dp"
                    android:layout_marginRight="1dp"
                    android:layout_marginBottom="2dp"
                    android:layout_weight="1"
                    android:background="@color/white"
                    android:gravity="center"
                    android:padding="5dp"
                    android:singleLine="true"
                    android:text="序号"
                    android:textSize="14sp"
                    android:textStyle="bold" />

                <TextView
                    android:id="@+id/tvColumAddress"
                    android:layout_width="0dp"
                    android:layout_height="wrap_content"
                    android:layout_marginRight="1dp"
                    android:layout_marginBottom="2dp"
                    android:layout_weight="4"
                    android:background="@color/white"
                    android:gravity="center"
                    android:padding="5dp"
                    android:singleLine="true"
                    android:text="地址"
                    android:textSize="14sp"
                    android:textStyle="bold" />

                <TextView
                    android:id="@+id/tvColumLL"
                    android:layout_width="0dp"
                    android:layout_height="wrap_content"
                    android:layout_marginRight="1dp"
                    android:layout_marginBottom="2dp"
                    android:layout_weight="2"
                    android:background="@color/white"
                    android:gravity="center"
                    android:padding="5dp"
                    android:singleLine="true"
                    android:text="经纬度"
                    android:textSize="14sp"
                    android:textStyle="bold" />

                <TextView
                    android:id="@+id/tvColumDistance"
                    android:layout_width="0dp"
                    android:layout_height="wrap_content"
                    android:layout_marginRight="2dp"
                    android:layout_marginBottom="2dp"
                    android:layout_weight="2"
                    android:background="@color/white"
                    android:gravity="center"
                    android:padding="5dp"
                    android:singleLine="true"
                    android:text="距离"
                    android:textSize="14sp"
                    android:textStyle="bold" />
            </LinearLayout>
        </TableRow>

    </TableLayout>
</RelativeLayout>

绘制完成后, 是这个样子

第二步: 创建表格数据对应的类

新建一个类, 用于保存即将填入表格中的每一条数据的信息。

public class DataItem {
    private String address, LL, distance;

    public DataItem(String address, String LL, String distance) {
        this.address = address;
        this.LL = LL;
        this.distance = distance;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    public String getLL() {
        return LL;
    }

    public void setLL(String LL) {
        this.LL = LL;
    }

    public String getDistance() {
        return distance;
    }

    public void setDistance(String distance) {
        this.distance = distance;
    }
}

第三步: 在Activity文件中动态添加表格行

在OnCreate()中添加数据

    // 声明变量
    TableLayout tableLayout;
    private List<DataItem> dataItems;

	@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // 添加要显示的数据
        dataItems.add(new DataItem("翻斗大街翻斗花园2号楼1001室", "(64, 52)", "97"));
        dataItems.add(new DataItem("地址", "(25, 46)", "79"));
        dataItems.add(new DataItem("地址", "(25, 46)", "79"));
        dataItems.add(new DataItem("地址", "(25, 46)", "79"));
        dataItems.add(new DataItem("地址", "(25, 46)", "79"));
		//绘制表格
        initTable();
    }

绘制表格

private void initTable() {
        tableLayout = findViewById(R.id.tableLayout);

        int padding = dip2px(getApplicationContext(), 5);

        // 遍历dataItems, 每一条数据都加进TableLayout中
        for(int i = 0; i<dataItems.size(); i++){
            // 获取一条数据
            DataItem dataItem = dataItems.get(i);

            // 新建一个TableRow并设置样式
            TableRow newRow = new TableRow(getApplicationContext());
            TableRow.LayoutParams layoutParams = new TableRow.LayoutParams();
            newRow.setLayoutParams(layoutParams);

            //新建一个LinearLayout
            LinearLayout linearLayout = new LinearLayout(getApplicationContext());
            linearLayout.setOrientation(LinearLayout.HORIZONTAL);

            // 底部边框的宽度
            int bottomLine = dip2px(getApplicationContext(), 1);
            if(i == dataItems.size() - 1) {
                // 如果当前行是最后一行, 则底部边框加粗
                bottomLine = dip2px(getApplicationContext(), 2);
            }

            // 第一列
            TextView tvNo = new TextView(getApplicationContext());
            // 设置文字居中
            tvNo.setGravity(Gravity.CENTER);
            // 设置表格中的数据不自动换行
            tvNo.setSingleLine();
            // 设置边框和weight
            LinearLayout.LayoutParams lpNo = new LinearLayout.LayoutParams(0, LinearLayout.LayoutParams.MATCH_PARENT, 1f);
            lpNo.setMargins(dip2px(getApplicationContext(), 2), 0, dip2px(getApplicationContext(), 1), bottomLine);
            tvNo.setLayoutParams(lpNo);
            // 设置padding和背景颜色
            tvNo.setPadding(padding, padding, padding, padding);
            tvNo.setBackgroundColor(Color.parseColor("#FFFFFF"));
            // 填充文字数据
            tvNo.setText((i+1) + "");

            // 第二列
            TextView tvAddress = new TextView(getApplicationContext());
            // 设置文字居中
            tvAddress.setGravity(Gravity.CENTER);
            // 设置表格中的数据不自动换行
            tvAddress.setSingleLine();
            // 设置边框和weight
            LinearLayout.LayoutParams lpAd = new LinearLayout.LayoutParams(0, LinearLayout.LayoutParams.MATCH_PARENT, 4f);
            lpAd.setMargins(0, 0, dip2px(getApplicationContext(), 1), bottomLine);
            tvAddress.setLayoutParams(lpAd);
            // 设置padding和背景颜色
            tvAddress.setPadding(padding, padding, padding, padding);
            tvAddress.setBackgroundColor(Color.parseColor("#FFFFFF"));
            // 填充文字数据
            tvAddress.setText(dataItem.getAddress());

            // 第三列
            TextView tvLL = new TextView(getApplicationContext());
            // 设置文字居中
            tvLL.setGravity(Gravity.CENTER);
            // 设置表格中的数据不自动换行
            tvAddress.setSingleLine();
            // 设置边框和weight
            LinearLayout.LayoutParams lpLL = new LinearLayout.LayoutParams(0, LinearLayout.LayoutParams.MATCH_PARENT, 2f);
            lpLL.setMargins(0, 0, dip2px(getApplicationContext(), 1), bottomLine);
            tvLL.setLayoutParams(lpLL);
            // 设置padding和背景颜色
            tvLL.setPadding(padding, padding, padding, padding);
            tvLL.setBackgroundColor(Color.parseColor("#FFFFFF"));
            // 填充文字数据
            tvLL.setText(dataItem.getLL());

            // 第四列
            TextView tvDistance = new TextView(getApplicationContext());
            // 设置文字居中
            tvDistance.setGravity(Gravity.CENTER);
            // 设置表格中的数据不自动换行
            tvAddress.setSingleLine();
            // 设置边框和weight
            LinearLayout.LayoutParams lpDistance = new LinearLayout.LayoutParams(0, LinearLayout.LayoutParams.MATCH_PARENT, 2f);
            lpDistance.setMargins(0, 0, dip2px(getApplicationContext(), 2), bottomLine);
            tvDistance.setLayoutParams(lpDistance);
            // 设置padding和背景颜色
            tvDistance.setPadding(padding, padding, padding, padding);
            tvDistance.setBackgroundColor(Color.parseColor("#FFFFFF"));
            // 填充文字数据
            tvDistance.setText(dataItem.getDistance());

            // 将所有新的组件加入到对应的视图中
            linearLayout.addView(tvNo);
            linearLayout.addView(tvAddress);
            linearLayout.addView(tvLL);
            linearLayout.addView(tvDistance);
            newRow.addView(linearLayout);
            tableLayout.addView(newRow);
        }
    }

由于new LayoutParams(width,height)其中的width和height的单位是px,不是dp,所以需要写一个函数px2dip(Context , dpValue)来进行进行转换px和dp的值。

private int dip2px(Context context, int dpValue) {
        final float scale = context.getResources().getDisplayMetrics().density;
        return (int) (dpValue * scale + 0.5f);
}

最后完整的MainActivity代码为

public class MainActivity extends AppCompatActivity {
    // 声明变量
    TableLayout tableLayout;
    private ArrayList<DataItem> dataItems = new ArrayList<DataItem>();


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // 添加要显示的数据
        dataItems.add(new DataItem("翻斗大街翻斗花园2号楼1001室", "(64, 52)", "97"));
        dataItems.add(new DataItem("地址", "(25, 46)", "79"));
        dataItems.add(new DataItem("地址", "(25, 46)", "79"));
        dataItems.add(new DataItem("地址", "(25, 46)", "79"));
        dataItems.add(new DataItem("地址", "(25, 46)", "79"));
		// 绘制表格
        initTable();
    }

    private void initTable() {
        tableLayout = findViewById(R.id.tableLayout);

        int padding = dip2px(getApplicationContext(), 5);

        // 遍历dataItems, 每一条数据都加进TableLayout中
        for(int i = 0; i<dataItems.size(); i++){
            // 获取一条数据
            DataItem dataItem = dataItems.get(i);

            // 新建一个TableRow并设置样式
            TableRow newRow = new TableRow(getApplicationContext());
            TableRow.LayoutParams layoutParams = new TableRow.LayoutParams();
            newRow.setLayoutParams(layoutParams);

            //新建一个LinearLayout
            LinearLayout linearLayout = new LinearLayout(getApplicationContext());
            linearLayout.setOrientation(LinearLayout.HORIZONTAL);

            // 底部边框的宽度
            int bottomLine = dip2px(getApplicationContext(), 1);
            if(i == dataItems.size() - 1) {
                // 如果当前行是最后一行, 则底部边框加粗
                bottomLine = dip2px(getApplicationContext(), 2);
            }

            // 第一列
            TextView tvNo = new TextView(getApplicationContext());
            // 设置文字居中
            tvNo.setGravity(Gravity.CENTER);
            // 设置表格中的数据不自动换行
            tvNo.setSingleLine();
            // 设置边框和weight
            LinearLayout.LayoutParams lpNo = new LinearLayout.LayoutParams(0, LinearLayout.LayoutParams.MATCH_PARENT, 1f);
            lpNo.setMargins(dip2px(getApplicationContext(), 2), 0, dip2px(getApplicationContext(), 1), bottomLine);
            tvNo.setLayoutParams(lpNo);
            // 设置padding和背景颜色
            tvNo.setPadding(padding, padding, padding, padding);
            tvNo.setBackgroundColor(Color.parseColor("#FFFFFF"));
            // 填充文字数据
            tvNo.setText((i+1) + "");

            // 第二列
            TextView tvAddress = new TextView(getApplicationContext());
            // 设置文字居中
            tvAddress.setGravity(Gravity.CENTER);
            // 设置表格中的数据不自动换行
            tvAddress.setSingleLine();
            // 设置边框和weight
            LinearLayout.LayoutParams lpAd = new LinearLayout.LayoutParams(0, LinearLayout.LayoutParams.MATCH_PARENT, 4f);
            lpAd.setMargins(0, 0, dip2px(getApplicationContext(), 1), bottomLine);
            tvAddress.setLayoutParams(lpAd);
            // 设置padding和背景颜色
            tvAddress.setPadding(padding, padding, padding, padding);
            tvAddress.setBackgroundColor(Color.parseColor("#FFFFFF"));
            // 填充文字数据
            tvAddress.setText(dataItem.getAddress());

            // 第三列
            TextView tvLL = new TextView(getApplicationContext());
            // 设置文字居中
            tvLL.setGravity(Gravity.CENTER);
            // 设置表格中的数据不自动换行
            tvAddress.setSingleLine();
            // 设置边框和weight
            LinearLayout.LayoutParams lpLL = new LinearLayout.LayoutParams(0, LinearLayout.LayoutParams.MATCH_PARENT, 2f);
            lpLL.setMargins(0, 0, dip2px(getApplicationContext(), 1), bottomLine);
            tvLL.setLayoutParams(lpLL);
            // 设置padding和背景颜色
            tvLL.setPadding(padding, padding, padding, padding);
            tvLL.setBackgroundColor(Color.parseColor("#FFFFFF"));
            // 填充文字数据
            tvLL.setText(dataItem.getLL());

            // 第四列
            TextView tvDistance = new TextView(getApplicationContext());
            // 设置文字居中
            tvDistance.setGravity(Gravity.CENTER);
            // 设置表格中的数据不自动换行
            tvAddress.setSingleLine();
            // 设置边框和weight
            LinearLayout.LayoutParams lpDistance = new LinearLayout.LayoutParams(0, LinearLayout.LayoutParams.MATCH_PARENT, 2f);
            lpDistance.setMargins(0, 0, dip2px(getApplicationContext(), 2), bottomLine);
            tvDistance.setLayoutParams(lpDistance);
            // 设置padding和背景颜色
            tvDistance.setPadding(padding, padding, padding, padding);
            tvDistance.setBackgroundColor(Color.parseColor("#FFFFFF"));
            // 填充文字数据
            tvDistance.setText(dataItem.getDistance());

            // 将所有新的组件加入到对应的视图中
            linearLayout.addView(tvNo);
            linearLayout.addView(tvAddress);
            linearLayout.addView(tvLL);
            linearLayout.addView(tvDistance);
            newRow.addView(linearLayout);
            tableLayout.addView(newRow);
        }
    }

    private int dip2px(Context context, int dpValue) {
        final float scale = context.getResources().getDisplayMetrics().density;
        return (int) (dpValue * scale + 0.5f);
    }
}

运行结果

标签:DataItem,表格,add,TableLayout,new,Android,dataItems,String
From: https://www.cnblogs.com/spiropentadiene/p/16888397.html

相关文章

  • Android 启动优化测试
    adb命令adbshellamstart-W-n包名(appPackage)/类名(appActivity)adbshellamstart-W-ncom.hellotalk/.lib.main.launch.ui.LaunchActivity 执行结果如......
  • Android动态权限申请
    Android动态权限申请在Android6.0后,安卓开发权限的申明就不再只是在AndroidManifest.xml文件中声明了,大多数权限都需要用户的允许。权限申请首先和6.0以前一样,在Androi......
  • android input
    通常,从EditText中获取字符串很简单:   EditTexttext=findViewById(R.id.textName);   Stringname=text.getText().toString();现在要从其中获得数字,就要做以......
  • [笔记] Android开发中的gradle是什么?
    gradle是什么?先看下文档中的介绍  https://docs.gradle.org/current/userguide/what_is_gradle.htmlGradleisanopen-source buildautomationtoolthatisdes......
  • 使用JAX构建强化学习agent并借助TensorFlowLite将其部署到Android应用中
    在之前发布文章《一个新TensorFlowLite示例应用:棋盘游戏》中,展示了如何使用TensorFlow和TensorFlowAgents来训练强化学习(RL)agent,使其玩一个简单棋盘游戏“Pl......
  • Android Studio Dolphin 稳定版正式发布
     作者/YuriBlaise,ProductManager,Android为了帮助开发者们更轻松地打造高质量应用,AndroidStudio 团队深入调研,为大家带来了最新稳定版AndroidStudioDolphi......
  • JS动态表格添加数据删除
    <!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><title>动态表格</title><style>table{border:1pxsolid;margin:auto;......
  • 学习笔记-一文读懂Android Gradle
    一文读懂AndroidGradle为什么写这个?Gradle是什么AS中的GradleBuildScript执行顺序gradle对象setting对象project对象Rootbuild.gradlebuildscriptallproje......
  • Android TCP客户端
    文章目录​​一、创建工程​​​​二、添加网络权限​​​​三、添加布局代码​​​​四、添加逻辑代码​​​​五、通信测试​​​​六、源码分享​​一、创建工程二、添加......
  • Android开发linux下使用命令行安装android_sdk开发环境
    在https://developer.android.com/studio选择下载Commandlinetoolsonly然后按照https://developer.android.com/studio/command-line/sdkmanager步骤操作从Android......