Android自定義DataGridView數(shù)據(jù)表格控件
我是一個.net程序員,但是苦于公司要求開發(fā)一個android app,沒辦法,只能硬著頭皮上了。
由于項目里面很多地方需要用到數(shù)據(jù)顯示控件(類似于.net的DataGridView),度娘找了下發(fā)現(xiàn)沒人公開類似的控件,沒辦法只好自己寫了。
廢話不多說,直接貼代碼:
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; }
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Android使用GridView實現(xiàn)表格分割線效果
- Android自定義View實現(xiàn)課程表表格
- Android自定義View實現(xiàn)仿GitHub的提交活躍表格
- Android listView 繪制表格實例詳解
- Android應(yīng)用中通過Layout_weight屬性用ListView實現(xiàn)表格
- Android中使用ListView實現(xiàn)漂亮的表格效果
- Android提高之ListView實現(xiàn)自適應(yīng)表格的方法
- Android中使用ListView繪制自定義表格技巧分享
- android表格效果之ListView隔行變色實現(xiàn)代碼
- Android自定義view繪制表格的方法
相關(guān)文章
ViewPager實現(xiàn)帶引導(dǎo)小圓點與自動跳轉(zhuǎn)的引導(dǎo)界面
這篇文章主要為大家詳細(xì)介紹了ViewPager實現(xiàn)帶引導(dǎo)小圓點與自動跳轉(zhuǎn)的引導(dǎo)界面,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-11-11Android基于ViewFilpper實現(xiàn)文字LED顯示效果示例
這篇文章主要介紹了Android基于ViewFilpper實現(xiàn)文字LED顯示效果,結(jié)合完整實例形式分析了Android使用ViewFilpper實現(xiàn)文字LED顯示動畫效果的相關(guān)步驟與實現(xiàn)技巧,需要的朋友可以參考下2017-08-08Android 開發(fā)系統(tǒng)自帶語音模塊應(yīng)用
本篇文章 主要介紹 Android 開發(fā)自帶語音模塊實例,在開發(fā)Android系統(tǒng)中會用到系統(tǒng)語音搜索模塊,這里給大家一個參考實例2016-07-07