Android Java 原生控件(TableView/DataGridView)表格控件,显示文本和和View

是否担心控件使用起来非常麻烦,还需要配置xml才可以使用?作者原创的这个控件不在需要繁琐的配置步骤,只需要你创建一个类,然后使用就可以了,接下来我来介绍一下,好用的话记得点个赞哟。

1.、创建一个类叫做 MyTableView (随便你),复制粘贴就好了。

package com.sfms.deltest2;

import android.view.View;
import android.widget.LinearLayout;
import android.widget.TextView;

import java.util.ArrayList;
import java.util.List;

public class MyTableView {

    LinearLayout table_view;

    public LinearLayout table_columns = null;  // 表的列头s,所有的表头都在里面
    public List<LinearLayout> table_rows = new ArrayList<>(); // 表的所有行(LinearLayout) 链表
    public List<List<View>> table_data = new ArrayList<>();  // 表的所有单元格(View) 表(不包含列头)

    int rowCount = 0;
    int defaultCellsPadding = 0;
    int defaultColumnWidth = 100;

    public MyTableView(LinearLayout table_view)
    {
        this.table_view = table_view;
    }

    public void addTextColumn(String columnText)
    {
        if(table_columns == null)
        {
            table_columns = new LinearLayout(table_view.getContext());
        }

        // 创建一个TextView
        TextView new_tv = new TextView(table_view.getContext());
        new_tv.setWidth(defaultColumnWidth);
        new_tv.setText(columnText);

        table_columns.addView(new_tv);
    }

    public void setTextColumns(String[] columnsText)
    {
        clearColumns();

        this.table_columns = new LinearLayout(table_view.getContext());

        // 创建一个文本列头
        for(int i = 0; i<columnsText.length;i++)
        {
            TextView new_tv = new TextView(table_view.getContext());
            new_tv.setWidth(defaultColumnWidth);
            new_tv.setText(columnsText[i]);
            table_columns.addView(new_tv);
        }

        table_view.addView(table_columns, 0);
    }

    public int getColumnWidth(int colIndex)
    {
        View column;
        try
        {
            column = table_columns.getChildAt(colIndex);
        }
        catch (Exception e)
        {
            return defaultColumnWidth; // 如果这一列不存在,那么我们将会使用默认大小
        }

        return column.getWidth();
    }

    public void setColumnWidth(int colIndex, int newWidth)
    {
        // 更改xml
        // 更改列头的宽度
        for (int i = 0 ; i < table_columns.getChildCount(); i++)
        {
            var column = table_columns.getChildAt(i);

            var params = column.getLayoutParams();
            params.width = newWidth;
            column.setLayoutParams(params);
        }

        // 更改Cells
        for (var row: table_data)
        {
            var params = row.get(colIndex).getLayoutParams();
            params.width = newWidth;
            row.get(colIndex).setLayoutParams(params);
        }
    }

    public void setAllColumnsWidth(int width) // 设置列的宽度
    {
        // 更改xml
        // 更改列头的宽度
        for (int i = 0 ; i < table_columns.getChildCount(); i++)
        {
            var column = table_columns.getChildAt(i);

            var params = column.getLayoutParams();
            params.width = width;
            column.setLayoutParams(params);
        }

        // 更改Cells
        for (var row: table_data)
        {
            for (var cell : row)
            {
                var params = cell.getLayoutParams();
                params.width = width;
                cell.setLayoutParams(params);
            }
        }

        defaultColumnWidth = width;
    }

    public void clearColumns()
    {
        if(table_columns == null)
        {
            return;
        }
        this.table_view.removeView(this.table_columns);
        this.table_columns = null;
    }

    public int addTextRow(String[] cells_content) // 添加一行字符串行(返回新行的索引)
    {
        LinearLayout table_row = new LinearLayout(table_view.getContext());

        List<View> row_data = new ArrayList<>();

        table_row.setOrientation(LinearLayout.HORIZONTAL);

        int i = 0;
        for (var cell_content : cells_content)
        {
            TextView textView_new = new TextView(table_view.getContext());

            // 初始化
            textView_new.setPadding(this.defaultCellsPadding, this.defaultCellsPadding, this.defaultCellsPadding, this.defaultCellsPadding);
            textView_new.setWidth(getColumnWidth(i));

            textView_new.setText(cell_content);

            table_row.addView(textView_new);
            // 记录视图
            row_data.add(textView_new);

            i++;
        }
        table_view.addView(table_row);

        // 记录视图
        table_rows.add(table_row);
        table_data.add(row_data);

        rowCount ++;

        return rowCount - 1;
    }

    public int addViewRow(View[] new_row_views) // 添加一行自定义视图行
    {
        LinearLayout table_row = new LinearLayout(table_view.getContext());
        List<View> row_data = new ArrayList<>();

        table_row.setOrientation(LinearLayout.HORIZONTAL);

        for (var cell : new_row_views)
        {
            table_row.addView(cell);
            row_data.add(cell);
        }

        // 内部记录
        table_rows.add(table_row);
        table_data.add(row_data);

        // 初始化新创建的行
        setRowCellsPadding(rowCount, this.defaultCellsPadding);
        setAllColumnsWidth(defaultColumnWidth);

        rowCount ++;

        return rowCount - 1;
    }

    public int getCellWidth(int rowIndex, int cellIndex)
    {
        var params = table_data.get(rowIndex).get(cellIndex).getLayoutParams();
        return params.width;
    }

    public void setCellPadding(int rowIndex, int cellIndex, int new_padding)
    {
        View v = table_data.get(rowIndex).get(cellIndex);

        v.setPadding(new_padding, new_padding, new_padding, new_padding);
    }

    public void setRowCellsPadding(int rowIndex, int newPadding)
    {
        int cellsCount = table_data.get(rowIndex).size();

        for (int i = 0; i<cellsCount;i++)
        {
            setCellPadding(rowIndex, i, newPadding);
        }
    }

    public void setAllCellsPadding(int new_padding) // 设置单元格外边距
    {
        for (int i = 0; i<rowCount;i++)
        {
            setRowCellsPadding(i, new_padding);
        }
        defaultCellsPadding = new_padding;
    }

    public void setCellView(int rowIndex, int cellIndex, View new_v)
    {
        // 更改xml
        var row = table_rows.get(rowIndex);

        var oldView = table_data.get(rowIndex).get(cellIndex);

        // 在xml中循环查找
        for (int i = 0; i<row.getChildCount();i++)
        {
            if(row.getChildAt(i) == oldView)
            {
                row.removeView(oldView);
                row.addView(new_v, i);
            }
        }

        // 更改类数据
        table_data.get(rowIndex).set(cellIndex, new_v);
    }

    public void setCellText(int rowIndex, int cellIndex, String text)
    {
        var row = table_data.get(rowIndex);

        TextView cell = (TextView) row.get(cellIndex);

        cell.setText(text);
    }
}

2、然后再xml中写一个<LinearLayout>格式布局,这个将被当做表格,记住要是vertical(垂直排列)哈,不然就糟糕了。

<LinearLayout
            android:id="@+id/table"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical">

</LinearLayout>

3、然后我们就可以在Java代码中对表格控件进行操作了,小白不懂如何做的就把代码放在OnCreate,哈哈哈,相信你们都会用。。。(本控件行/列的索引都从0开始)

分配一下对象,进行绑定,(额,你们应该看的懂了吧),table就是上面那个LinearLayout(有小朋友这时候就要问了,为啥要用LinearLayout当表格控件用,呃呃呃,你懂得,简单至上,太麻烦了,主播懒),代码具体意思:通过id找到控件,传参给构造函数,类将会绑定这个控件进行操作

//绑定TableView
MyTableView tableView = new MyTableView(findViewById(R.id.table));

接下来,就是操作时间:

初始化列:
String[] columns = {"列1", "列2"};
tableView.setTextColumns(columns);
添加一行:
String[] arr = {"你好", "hello"};
tableView.addTextRow(arr);
更改单元格(Cell)的文本:
tableView.setCellText(rowIndex, colIndex, newText);
设置所有列宽度:(想只更改一列的宽度用 setColumnWidth )
tableView.setAllColumnsWidth(new_width);
设置所有单元格内边距:(更改某一行所有单元格内边距 setRowCellsPadding / 设置某一个单元格内边距  setCellPadding )
tableView.setAllCellsPadding(new_padding);

进阶玩法:设置某一个单元格为一个新的View。你可以使用addTextRow先添加一个文本行(里面全是TextView),然后在使用 setCellView 将 TextView 替换为你的View,什么都行,可以实现一个单元格里有多个控件。

tableView.setCellView(rowIndex, cellIndex, your_view);

进阶玩法:添加一行自定义视图行,跟上面一个原理,注意:自定义View宽度要与列宽度相同,否则后果自负

tableView.addViewRow(View[] new_row_views)

还有好多功能没实现(删除等等),不过如果你是高手,你可以自己添加功能:

    public LinearLayout table_columns = null;  // 表的列头s,所有的表头都在里面
    public List<LinearLayout> table_rows = new ArrayList<>(); // 表的所有行(LinearLayout) 链表
    public List<List<View>> table_data = new ArrayList<>();  // 表的所有单元格(View) 表(不包含列头)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值