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; }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。