首页 > 代码库 > Android中使用ListView绘制自定义表格(2)

Android中使用ListView绘制自定义表格(2)

上回再写了《Android中使用ListView绘制自定义表格》后,很多人留言代码不全和没有数据样例。但因为项目原因,没法把源码全部贴上来。近两天,抽空简化了一下,做了一个例子。

效果图如


一、功能:

     1、支持列合并

     2、考虑了界面刷新优化

     3、预留部分接口

     4、支持左右滚动

1、枚举类:CellTypeEnum

package csdn.danielinbiti.custometableview.item;

public enum CellTypeEnum {	 
	 STRING   //字符
	 ,DIGIT   //数字 
	 ,LABEL   //标签
}
该类定义了表格支持的样式,可以根据需要扩充,扩充了新类型,注意同时修改CustomeTableItem中新类型样式的创建方式


2、核心代码CustomeTableItem,该类对应ListView的一行item。类支持列合并,没有实现行合并(行合并样式控制上会比较复杂些,如有需要自己改写吧)

rowtype:该值主要表示表格中不同行的样式,如果合并的列都一样的行,则可以复用,不需要再创建了。

package csdn.danielinbiti.custometableview.item;

import java.util.ArrayList;

import csdn.danielinbiti.custometableview.R;

import android.content.Context;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.LinearLayout.LayoutParams;

public class CustomeTableItem extends LinearLayout {
	private Context context = null;
	private boolean isRead = false;//是否只读
	private ArrayList<View> viewList = new ArrayList();//行的表格列表
	private int[] headWidthArr = null;//表头的列宽设置
	private String rowType = "0";//行的样式id
	
	public CustomeTableItem(Context context) {
		super(context);
	}
	public CustomeTableItem(Context context, AttributeSet attrs) {
		super(context, attrs);
	}
	public CustomeTableItem(Context context, AttributeSet attrs, int defStyle) {
		super(context, attrs, defStyle);
	}
	/*
	 * rowType:行的样式,字符任意,相同样式的行不需要再创建了
	 * itemCells:单元格信息
	 * headWidthArr:每列宽度
	 * isRead:是否只读,如果是只读,则所有的输入都不生效
	 */
    public void buildItem(Context context,String rowType,ArrayList<ItemCell> itemCells
    		,int[] headWidthArr,boolean isRead){
		this.setOrientation(LinearLayout.VERTICAL);//第一层布局垂直
    	this.context = context;
    	this.headWidthArr =headWidthArr.clone();
        this.rowType = rowType;
        
    	this.addCell(itemCells);
    }
    private void addCell(ArrayList<ItemCell> itemCells){
    	this.removeAllViews();
    	LinearLayout secondLayout = new LinearLayout(context);
		secondLayout.setOrientation(LinearLayout.HORIZONTAL);
		secondLayout.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT,LayoutParams.WRAP_CONTENT));
		this.addView(secondLayout);
    	int cellIndex = 0;
    	for(int i=0;i<itemCells.size();i++){
    		ItemCell itemCell = itemCells.get(i);
			int endIndex = cellIndex+itemCell.getCellSpan();//所占行数

			int width = getCellWidth(cellIndex,endIndex);//行宽度
			cellIndex = endIndex;
	    	if(itemCell.getCellType()==CellTypeEnum.STRING){
	    		EditText view= (EditText)getInputView();
				view.setText(itemCell.getCellValue());
				view.setWidth(width);
				this.setEditView(view);
				secondLayout.addView(view);
				viewList.add(view);
	    	}else if(itemCell.getCellType()==CellTypeEnum.DIGIT){
	    		EditText view= (EditText)getInputView();
				view.setText(itemCell.getCellValue());
				view.setWidth(width);
				this.setEditView(view);
				this.setOnKeyBorad(view);
				secondLayout.addView(view);
				viewList.add(view);
	    	}else if(itemCell.getCellType()==CellTypeEnum.LABEL){
	    		TextView view = (TextView)getLabelView();
				view.setText(itemCell.getCellValue());
				view.setWidth(width);
				secondLayout.addView(view);
				viewList.add(view);
	    	}
	    	if(i!=itemCells.size()-1){//插入竖线
				LinearLayout v_line = (LinearLayout)getVerticalLine();
				v_line.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT));
				secondLayout.addView(v_line);
			}
    	}
    }
    public void refreshData(ArrayList<ItemCell> itemCells){
		for(int i=0;i<itemCells.size();i++){
			ItemCell itemCell = itemCells.get(i);
			if(itemCell.getCellType()==CellTypeEnum.LABEL){
				TextView view = (TextView)viewList.get(i);
				view.setText(itemCell.getCellValue());
			}else if(itemCell.getCellType()==CellTypeEnum.DIGIT){
				EditText view= (EditText)viewList.get(i);
				view.setText(itemCell.getCellValue());
				this.setEditView(view);
				this.setOnKeyBorad(view);
			}else if(itemCell.getCellType()==CellTypeEnum.STRING){
				EditText view= (EditText)viewList.get(i);
				view.setText(itemCell.getCellValue());
				this.setEditView(view);
			}
		}
	}
    private View getVerticalLine(){
		return LayoutInflater.from(context).inflate(R.layout.atom_line_v_view, null);
	}
    private int getCellWidth(int cellStart,int cellEnd){
		int width = 0;
		for(int i=cellStart;i<cellEnd;i++){
			width = this.headWidthArr[i] + width;
		}
		return width;
	}
    private View getLabelView(){
		return (View)LayoutInflater.from(context).inflate(R.layout.atom_text_view, null);
	}
	private View getInputView(){
		return (View)LayoutInflater.from(context).inflate(R.layout.atom_edttxt_view, null);
	}
	private void setEditView(EditText edtText1){
    	if(this.isRead){
    		edtText1.setEnabled(false);
    	}else{
    		
    	}
	}
	private void setOnKeyBorad(EditText edtText1){
		//数字键盘
		if(!this.isRead){//非只读
			
		}
	}
	public String getRowType() {
		return rowType;
	}
}


源码下载地址点击打开链接







Android中使用ListView绘制自定义表格(2)