你的位置:首页 > 操作系统

[操作系统]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);  }  public void removeRow(Map<String,String> row){    rows.remove(row);  }  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 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;}