Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android開發 >> 關於android開發 >> Android 自定義DataGridView數據表格控件,android自定義控件

Android 自定義DataGridView數據表格控件,android自定義控件

編輯:關於android開發

Android 自定義DataGridView數據表格控件,android自定義控件


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

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved