Android自定义DataGridView数据表格控件

我是一个.net程序员,但是苦于公司要求开发一个android app,没办法,只能硬着头皮上了。

由于项目里面很多地方需要用到数据显示控件(类似于.net的DataGridView),度娘找了下发现没人公开类似的控件,没办法只好自己写了。

废话不多说,直接贴代码:

public class DataGridView extends HorizontalScrollView { private List<DataGridViewColumn> columns; private List<Map<String,String>> rows; private boolean hasHeader; private CellClickListener cellClickListener; private RowClickListener rowClickListener; private RowValidatorListener rowValidatorListener; private LinearLayout headerRow; private LinearLayout bodyRow; public DataGridView(Context context, AttributeSet attrs) { super(context, attrs); TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.DataGridView); hasHeader = a.getBoolean(R.styleable.DataGridView_hasHeader, true); a.recycle(); LayoutInflater inflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); LinearLayout container = (LinearLayout) inflater.inflate(R.layout.ctrl_data_grid_view, null, false); addView(container); this.columns = new ArrayList<DataGridViewColumn>(); this.rows = new ArrayList<Map<String,String>>(); headerRow = new LinearLayout(getContext()); headerRow.setOrientation(LinearLayout.HORIZONTAL); headerRow.setBackgroundResource(R.drawable.datagrid_header_background); headerRow.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT)); if (hasHeader){ container.addView(headerRow); } ScrollView scrollView = (ScrollView)inflater.inflate(R.layout.ctrl_data_grid_view_scroll, container, false); bodyRow = (LinearLayout) inflater.inflate(R.layout.ctrl_data_grid_view, scrollView, false); scrollView.addView(bodyRow); container.addView(scrollView); } public void addColumn(String dataField, String headerText){ this.addColumn(dataField, headerText, 200); } public void addColumn(String dataField, String headerText, int columnWidth){ this.addColumn(dataField, headerText, columnWidth, Gravity.START); } public void addColumn(String dataField, String headerText, int columnWidth, int textAlign){ this.addColumn(dataField, headerText, columnWidth, textAlign, Color.rgb(80, 80, 80)); } public void addColumn(String dataField, String headerText, int columnWidth, int textAlign, int textColor){ this.addColumn(dataField, headerText, columnWidth, textAlign, textColor, true); } public void addColumn(String dataField, String headerText, int columnWidth, int textAlign, int textColor, boolean isEnabled){ DataGridViewColumn column = new DataGridViewColumn(); column.dataField =dataField; column.headerText = headerText; column.columnWidth = columnWidth; column.textAlign = textAlign; column.textColor = textColor; column.isEnabled = isEnabled; this.addColumn(column); } public void addColumn(DataGridViewColumn column){ columns.add(column); insertColumn(column); if (rows.size() > 0){ bodyRow.removeAllViews(); for (Map<String,String> row : rows){ insertRow(row); } } } public void addColumn(DataGridViewColumn column, int index){ columns.add(column); insertColumn(column, index); if (rows.size() > 0){ bodyRow.removeAllViews(); for (Map<String,String> row : rows){ insertRow(row); } } } public void removeColumn(int index){ columns.remove(index); } public void removeColumn(String dataField){ for (DataGridViewColumn column : columns){ if (column.dataField.equals(dataField)){ this.removeColumn(column); if (rows.size() > 0){ bodyRow.removeAllViews(); for (Map<String,String> row : rows){ insertRow(row); } } return; } } } public void removeColumn(DataGridViewColumn column){ columns.remove(column); } public void setDataSource(List<Map<String,String>> rows){ this.rows = rows; if (columns.size() > 0){ bodyRow.removeAllViews(); for (Map<String,String> row : rows){ insertRow(row); } } } public void addRow(Map<String,String> row){ rows.add(row); if (columns.size() > 0) { insertRow(row); } } public void addRow(Map<String,String> row, int index){ rows.add(index, row); if (columns.size() > 0) { insertRow(row, index); } } public void removeRow(int index){ rows.remove(index); bodyRow.removeViewAt(index); } public void removeRow(Map<String,String> row){ int index = rows.indexOf(row); this.removeRow(index); } public void setCellClickListener(CellClickListener cellClickListener) { this.cellClickListener = cellClickListener; } public void setRowClickListener(RowClickListener rowClickListener) { this.rowClickListener = rowClickListener; } public void setRowValidatorListener(RowValidatorListener rowValidatorListener) { this.rowValidatorListener = rowValidatorListener; } public boolean isHasHeader() { return hasHeader; } public void setHasHeader(boolean hasHeader) { this.hasHeader = hasHeader; } private void insertColumn(DataGridViewColumn column){ this.insertColumn(column, -1); } private void insertColumn(DataGridViewColumn column, int index){ LayoutInflater inflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); TextView headerTextView = (TextView) inflater.inflate(R.layout.ctrl_data_grid_view_column, headerRow, false); headerTextView.setText(column.headerText); headerTextView.setLayoutParams(new LayoutParams(column.columnWidth, LayoutParams.WRAP_CONTENT, 1)); if (index == -1){ headerRow.addView(headerTextView); }else { headerRow.addView(headerTextView, index); } } public DataGridViewColumn getColumn(int index){ return columns.get(index); } private void insertRow(final Map<String, String> row){ this.insertRow(row, -1); } private void insertRow(final Map<String,String> row, int index){ LinearLayout dataRow = new LinearLayout(getContext()); dataRow.setOrientation(LinearLayout.HORIZONTAL); dataRow.setSelected(true); dataRow.setClickable(true); dataRow.setBackgroundResource(R.drawable.datagrid_row_border); dataRow.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT)); LayoutInflater inflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); for (final DataGridViewColumn column : columns){ String cellText = row.get(column.dataField); TextView rowFieldText = (TextView) inflater.inflate(R.layout.ctrl_data_grid_view_cell, dataRow, false); rowFieldText.setText(cellText); rowFieldText.setGravity(column.textAlign); rowFieldText.setTextColor(column.textColor); rowFieldText.setLayoutParams(new LayoutParams(column.columnWidth, LayoutParams.WRAP_CONTENT, 1)); dataRow.addView(rowFieldText); if (column.isEnabled) { rowFieldText.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { if (cellClickListener != null) { cellClickListener.onClick(row, column.dataField); } } }); } else { rowFieldText.setTextColor(Color.rgb(128, 128, 128)); } } if (rowValidatorListener != null){ rowValidatorListener.onValidator(dataRow, row); } if (index == -1){ bodyRow.addView(dataRow); }else { bodyRow.addView(dataRow, index); } dataRow.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (rowClickListener != null) { rowClickListener.onClick(row); } } }); } public void updateRow(Map<String,String> row){ int index = rows.indexOf(row); bodyRow.removeViewAt(index); this.insertRow(row, index); } public Map<String,String> getRow(int index) { return rows.get(index); } public int getColumnsCount() { return columns.size(); } public int getRowsCount() { return rows.size(); } public interface CellClickListener{ void onClick(Map<String,String> rowData, String dataField); } public interface RowClickListener{ void onClick(Map<String,String> rowData); } public interface RowValidatorListener{ void onValidator(ViewGroup v,Map<String,String> rowData); } }

代码里面用到的列属性类也附上:

public class DataGridViewColumn { public String dataField; public String headerText; public int columnWidth; public int textAlign; public int textColor; public boolean isEnabled; }

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

时间: 2024-10-28 11:58:10

Android自定义DataGridView数据表格控件的相关文章

使用DataGridView数据窗口控件,构建用户快速输入体验

在"随风飘散" 博客里面,介绍了一个不错的DataGridView数据窗口控件<DataGridView数据窗口控件开发方法及其源码提供下载>,这种控件在有些场合下,还是非常直观的.因为,在一般要求客户录入数据的地方,一般有两种途径,其一是通过弹出一个新的窗口,在里面列出各种需要输入的要素,然后保存的,如下图所示:   其二就是直接在DataGridView中直接输入.这两种方式各有优劣,本文介绍采用该控件实现第二种模式的数据数据.如下图所示    这种方式,直接通过在Da

c#对数据表格控件已选行记录的调用

问题描述 c#对数据表格控件已选行记录的调用 public partial class FrmMainfo : Form { public FrmMainfo() { InitializeComponent(); } string connStr = ConfigurationManager.ConnectionStrings[""str""].ConnectionString; private void button2_Click(object sender Ev

Android自定义View之组合控件实现类似电商app顶部栏_Android

本文实例为大家分享了Android自定义View之组合控件,仿电商app顶部栏的相关代码,供大家参考,具体内容如下 效果图: 分析:左右两边可以是TextView和Button,设置drawableTop即可,中间的看着像是EditText,但是用过淘宝天猫等类似app的话会发现点击搜索不是在当前Activit进行搜索的,是跳转到另外的页面进行的,所以用TextView然后设置背景即可. 实现流程 参数列表: 设置属性文件:values下建立attrs.xml文件,添加需要自定义的属性. <?x

Android自定义滑动接听电话控件组实例_Android

本文根据组件开发思想,首先介绍android自定义控件,然后将自定义的控件封装为jar包.最为实现滑动接听电话控件组. 一.目录结构 二.运行效果 三.代码实现 首先,自定义一个类IncomingPhone继承RelativeLayout public IncomingPhone(Context context, AttributeSet attrs) { super(context, attrs); mContext = context; TextView textView = new Tex

Android自定义View之组合控件实现类似电商app顶部栏

本文实例为大家分享了Android自定义View之组合控件,仿电商app顶部栏的相关代码,供大家参考,具体内容如下 效果图: 分析:左右两边可以是TextView和Button,设置drawableTop即可,中间的看着像是EditText,但是用过淘宝天猫等类似app的话会发现点击搜索不是在当前Activit进行搜索的,是跳转到另外的页面进行的,所以用TextView然后设置背景即可. 实现流程 参数列表: 设置属性文件:values下建立attrs.xml文件,添加需要自定义的属性. <?x

Android自定义下拉刷新控件RefreshableView_Android

这是在了解下拉刷新功能原理下的产物,下拉刷新可以说是国产APP里面必有的功能,连Google都为此出了SwipeRefreshLayout,一种MD风格的下拉刷新. 不过,MD风格在国内似乎很是艰难,不单单是国内系统主流仍是4.4的原因,也有用户习惯的问题,扯的有点多了,在看了许多博客之后,我突然想写一个能仿照 SwipeRefreshLayout 的兼容所有控件的下拉刷新,不单单只是 ListView,希望它也可以包容普通的View和ScrollView,经过两天的奋斗,终于搞定了,因为我的目

Android自定义View弧线进度控件_Android

这个是一个以弧线为依托的进度控件,主要包括了两个圆弧.一个圆.一个文本.   当我们点击开始按钮的时候,会出现一个动画,逐渐的出现进度,好了,下面开始我们的编码. 新建一个类,继承自View,实现三个构造方法,接着定义变量,初始化变量的数据.代码如下: private Paint mArcPaint, mCirclePaint, mTextPaint, mPaint; private float length; private float mRadius; private float mCirc

Android自定义ViewGroup之子控件的自动换行和添加删除

常用的布局类型并不能满足所有需求,这时就会用到ViewGroup. ViewGroup作为一个放置View的容器,并且我们在写布局xml的时候,会告诉容器(凡是以layout为开头的属性,都是为用于告诉容器的),我们的宽度(layout_width).高度(layout_height).对齐方式(layout_gravity)等:当然还有margin等:于是乎,ViewGroup需要做的事情是:给childView计算出建议的宽和高和测量模式 :决定childView的位置:为什么只是建议的宽和

Android自定义实现循环滚轮控件WheelView_Android

首先呈上Android循环滚轮效果图:   现在很多地方都用到了滚轮布局WheelView,比如在选择生日的时候,风格类似系统提供的DatePickerDialog,开源的控件也有很多,不过大部分都是根据当前项目的需求绘制的界面,因此我就自己写了一款比较符合自己项目的WheelView. 首先这个控件有以下的需求:  1.能够循环滚动,当向上或者向下滑动到临界值的时候,则循环开始滚动  2.中间的一块有一块半透明的选择区,滑动结束时,哪一块在这个选择区,就选择这快.  3.继承自View进行绘制