是否担心控件使用起来非常麻烦,还需要配置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) 表(不包含列头)