首页 > 系统 > Android > 正文

Android自定义DataGridView数据表格控件

2019-12-12 04:34:40
字体:
来源:转载
供稿:网友

我是一个.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;}

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

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表