Android自定义DataGridView数据表格控件
我是一个.net程序员,但是苦于公司要求开发一个androidapp,没办法,只能硬着头皮上了。
由于项目里面很多地方需要用到数据显示控件(类似于.net的DataGridView),度娘找了下发现没人公开类似的控件,没办法只好自己写了。
废话不多说,直接贴代码:
publicclassDataGridViewextendsHorizontalScrollView{
privateList<DataGridViewColumn>columns;
privateList<Map<String,String>>rows;
privatebooleanhasHeader;
privateCellClickListenercellClickListener;
privateRowClickListenerrowClickListener;
privateRowValidatorListenerrowValidatorListener;
privateLinearLayoutheaderRow;
privateLinearLayoutbodyRow;
publicDataGridView(Contextcontext,AttributeSetattrs){
super(context,attrs);
TypedArraya=context.obtainStyledAttributes(attrs,R.styleable.DataGridView);
hasHeader=a.getBoolean(R.styleable.DataGridView_hasHeader,true);
a.recycle();
LayoutInflaterinflater=(LayoutInflater)getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
LinearLayoutcontainer=(LinearLayout)inflater.inflate(R.layout.ctrl_data_grid_view,null,false);
addView(container);
this.columns=newArrayList<DataGridViewColumn>();
this.rows=newArrayList<Map<String,String>>();
headerRow=newLinearLayout(getContext());
headerRow.setOrientation(LinearLayout.HORIZONTAL);
headerRow.setBackgroundResource(R.drawable.datagrid_header_background);
headerRow.setLayoutParams(newLayoutParams(LayoutParams.MATCH_PARENT,LayoutParams.WRAP_CONTENT));
if(hasHeader){
container.addView(headerRow);
}
ScrollViewscrollView=(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);
}
publicvoidaddColumn(StringdataField,StringheaderText){
this.addColumn(dataField,headerText,200);
}
publicvoidaddColumn(StringdataField,StringheaderText,intcolumnWidth){
this.addColumn(dataField,headerText,columnWidth,Gravity.START);
}
publicvoidaddColumn(StringdataField,StringheaderText,intcolumnWidth,inttextAlign){
this.addColumn(dataField,headerText,columnWidth,textAlign,Color.rgb(80,80,80));
}
publicvoidaddColumn(StringdataField,StringheaderText,intcolumnWidth,inttextAlign,inttextColor){
this.addColumn(dataField,headerText,columnWidth,textAlign,textColor,true);
}
publicvoidaddColumn(StringdataField,StringheaderText,intcolumnWidth,inttextAlign,inttextColor,booleanisEnabled){
DataGridViewColumncolumn=newDataGridViewColumn();
column.dataField=dataField;
column.headerText=headerText;
column.columnWidth=columnWidth;
column.textAlign=textAlign;
column.textColor=textColor;
column.isEnabled=isEnabled;
this.addColumn(column);
}
publicvoidaddColumn(DataGridViewColumncolumn){
columns.add(column);
insertColumn(column);
if(rows.size()>0){
bodyRow.removeAllViews();
for(Map<String,String>row:rows){
insertRow(row);
}
}
}
publicvoidaddColumn(DataGridViewColumncolumn,intindex){
columns.add(column);
insertColumn(column,index);
if(rows.size()>0){
bodyRow.removeAllViews();
for(Map<String,String>row:rows){
insertRow(row);
}
}
}
publicvoidremoveColumn(intindex){
columns.remove(index);
}
publicvoidremoveColumn(StringdataField){
for(DataGridViewColumncolumn:columns){
if(column.dataField.equals(dataField)){
this.removeColumn(column);
if(rows.size()>0){
bodyRow.removeAllViews();
for(Map<String,String>row:rows){
insertRow(row);
}
}
return;
}
}
}
publicvoidremoveColumn(DataGridViewColumncolumn){
columns.remove(column);
}
publicvoidsetDataSource(List<Map<String,String>>rows){
this.rows=rows;
if(columns.size()>0){
bodyRow.removeAllViews();
for(Map<String,String>row:rows){
insertRow(row);
}
}
}
publicvoidaddRow(Map<String,String>row){
rows.add(row);
if(columns.size()>0){
insertRow(row);
}
}
publicvoidaddRow(Map<String,String>row,intindex){
rows.add(index,row);
if(columns.size()>0){
insertRow(row,index);
}
}
publicvoidremoveRow(intindex){
rows.remove(index);
bodyRow.removeViewAt(index);
}
publicvoidremoveRow(Map<String,String>row){
intindex=rows.indexOf(row);
this.removeRow(index);
}
publicvoidsetCellClickListener(CellClickListenercellClickListener){
this.cellClickListener=cellClickListener;
}
publicvoidsetRowClickListener(RowClickListenerrowClickListener){
this.rowClickListener=rowClickListener;
}
publicvoidsetRowValidatorListener(RowValidatorListenerrowValidatorListener){
this.rowValidatorListener=rowValidatorListener;
}
publicbooleanisHasHeader(){
returnhasHeader;
}
publicvoidsetHasHeader(booleanhasHeader){
this.hasHeader=hasHeader;
}
privatevoidinsertColumn(DataGridViewColumncolumn){
this.insertColumn(column,-1);
}
privatevoidinsertColumn(DataGridViewColumncolumn,intindex){
LayoutInflaterinflater=(LayoutInflater)getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
TextViewheaderTextView=(TextView)inflater.inflate(R.layout.ctrl_data_grid_view_column,headerRow,false);
headerTextView.setText(column.headerText);
headerTextView.setLayoutParams(newLayoutParams(column.columnWidth,LayoutParams.WRAP_CONTENT,1));
if(index==-1){
headerRow.addView(headerTextView);
}else{
headerRow.addView(headerTextView,index);
}
}
publicDataGridViewColumngetColumn(intindex){
returncolumns.get(index);
}
privatevoidinsertRow(finalMap<String,String>row){
this.insertRow(row,-1);
}
privatevoidinsertRow(finalMap<String,String>row,intindex){
LinearLayoutdataRow=newLinearLayout(getContext());
dataRow.setOrientation(LinearLayout.HORIZONTAL);
dataRow.setSelected(true);
dataRow.setClickable(true);
dataRow.setBackgroundResource(R.drawable.datagrid_row_border);
dataRow.setLayoutParams(newLayoutParams(LayoutParams.MATCH_PARENT,LayoutParams.WRAP_CONTENT));
LayoutInflaterinflater=(LayoutInflater)getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
for(finalDataGridViewColumncolumn:columns){
StringcellText=row.get(column.dataField);
TextViewrowFieldText=(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(newLayoutParams(column.columnWidth,LayoutParams.WRAP_CONTENT,1));
dataRow.addView(rowFieldText);
if(column.isEnabled){
rowFieldText.setOnClickListener(newOnClickListener(){
@Override
publicvoidonClick(Viewv){
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(newView.OnClickListener(){
@Override
publicvoidonClick(Viewv){
if(rowClickListener!=null){
rowClickListener.onClick(row);
}
}
});
}
publicvoidupdateRow(Map<String,String>row){
intindex=rows.indexOf(row);
bodyRow.removeViewAt(index);
this.insertRow(row,index);
}
publicMap<String,String>getRow(intindex){
returnrows.get(index);
}
publicintgetColumnsCount(){
returncolumns.size();
}
publicintgetRowsCount(){
returnrows.size();
}
publicinterfaceCellClickListener{
voidonClick(Map<String,String>rowData,StringdataField);
}
publicinterfaceRowClickListener{
voidonClick(Map<String,String>rowData);
}
publicinterfaceRowValidatorListener{
voidonValidator(ViewGroupv,Map<String,String>rowData);
}
}
代码里面用到的列属性类也附上:
publicclassDataGridViewColumn{
publicStringdataField;
publicStringheaderText;
publicintcolumnWidth;
publicinttextAlign;
publicinttextColor;
publicbooleanisEnabled;
}
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。