上回再写了《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;
}
}
源码下载地址点击打开链接