您的位置:首页 > 移动开发 > Android开发

Android自定义DataGridView数据表格控件

2016-11-21 08:54 806 查看

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

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

您可能感兴趣的文章:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐