Welcome

首页 / 移动开发 / Android / 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;}
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。