通用表格


要实现的效果举例:

 

方法一:遍历数据集,在代码中动态添加布局,设置布局的相关属性。

        缺点:单元格中布局复杂的情况下繁琐

 

方法二,需要5步:

1,  添加tablefixheaders.jar(7.2kb)到项目的lib下;

2,  在Activity的布局文件中添加table元素,如:


3,  添加TableFixAdapter类到适配器包中;

4,  将服务器返回的数据集合转换为二维数组,示例:



5,  最后一步,开始使用,如图:


构造器参数注释如下:

 

 

备注:

1,  列表转二维数组的代码只是个人提供参考所用,是否使用根据个人情况(武哥不要鄙视我代码质量);

2,  TableFixAdapter构造函数中的padding解释:如果布局效果需要有padding或者margin就设置下,不需要就传0,传0表示表格的宽度将铺满手机屏幕

3,  如果表格中的单元格想使用自定义的布局,在重写的getLayoutResource方法里返回指定自己的布局文件的Id,在重写的setData方法里对view设置数据即可。

4,  可指定列宽,不指定将以(屏幕宽度-左右间距)/ 列数计算,会显示拥挤,建议在多列的情况下指定列宽,屏幕之外的列可以滑动显示


TableFixAdapter类:


package com.coactsoft.adapter;

import android.content.Context;
import android.content.res.Resources;
import android.util.DisplayMetrics;
import android.util.TypedValue;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

import com.table.adapters.TableAdapter;

/**
 * 表格适配器
 * 
 * @author pj
 * 
 * @param <T>
 *            每个单元格里对应数据的类型
 */
public abstract class TableFixAdapter<T> implements TableAdapter {
	// 上下文
	private final Context context;
	private final LayoutInflater inflater;
	// 默认行高列宽,单位dp
	private final static int HEIGHT_DP = 45;
	// 数据集
	private T[][] datas;

	// 列宽、行高,单位:px
	private int colWidth, rowHeight;
	// 行数,列数
	private int rows, cols;
	// 单元格是否使用默认布局
	private boolean mIsDefLayout;

	/**
	 * 
	 * @param context 上下文
	 * @param datas 二维数组数据
	 * @param padding
	 *            左间距或右间距,如果布局效果需要有padding或者margin就设置下,
	 *            不需要就传0,传0表示表格的宽度将铺满手机屏幕
	 * @param unit
	 *            间距单位:0-px;1-dp,无间距时可任意传值
	 * @param isDefLayout
	 *            -true:单元格使用默认的TextView,setData和getLayoutResource方法无须理会
	 *            否则:使用GridAdapter子类重写的setData和getLayoutResource方法
	 * @param isDefColWidth
	 *            是否使用默认列宽,表格有多列的情况下建议使用,这样可以滑动查看
	 * @param colWidthDp
	 *            默认的列宽值,isDefColWidth为true时候才起作用
	 */
	public TableFixAdapter(Context context, T[][] datas, int padding, int unit,
			boolean isDefLayout, boolean isDefColWidth, int colWidthDp) {
		this.context = context;
		this.inflater = LayoutInflater.from(context);
		this.mIsDefLayout = isDefLayout;
		if (datas != null && datas.length > 0) {
			rows = datas.length;
			cols = datas[0].length;
		}
		// 设置列宽、行高
		setSize(padding, unit, isDefColWidth, colWidthDp);
		setData(datas);
	}

	/*
	 * 设置列宽、行高
	 */
	private void setSize(int padding, int unit, boolean isDefColWidth,
			int colWidthDp) {
		Resources r = context.getResources();
		DisplayMetrics dm = r.getDisplayMetrics();
		int screenW = dm.widthPixels;
		int paddingPx = Math.round(TypedValue.applyDimension(
				unit == 0 ? TypedValue.COMPLEX_UNIT_PX
						: TypedValue.COMPLEX_UNIT_DIP, padding, dm));
		colWidth = isDefColWidth ? Math.round(TypedValue.applyDimension(
				TypedValue.COMPLEX_UNIT_DIP, colWidthDp, dm))
				: (screenW - paddingPx * 2) / cols;
		rowHeight = Math.round(TypedValue.applyDimension(
				TypedValue.COMPLEX_UNIT_DIP, HEIGHT_DP, dm));
	}

	public void setData(T[][] datas) {
		this.datas = datas;
	}

	@Override
	public int getRowCount() {
		return rows - 1;
	}

	@Override
	public int getColumnCount() {
		return cols - 1;
	}

	@Override
	public View getView(int row, int column, ViewGroup parent) {
		if (mIsDefLayout) {
			return generateView(datas[row + 1][column + 1]);
		} else {
			// 使用自定义的布局渲染单元格,通过在子类中重写getLayoutResource方法实现
			final View view = inflater.inflate(getLayoutResource(row, column),
					parent, false);
			// 设置自定义布局中的数据,通过在子类中重写setData方法实现
			setData(view, row, column);
			return view;
		}
	}

	private View generateView(T item) {
		if (item instanceof String) {
			// 单元格里的数据是String类型,使用TextView渲染
			final TextView textView = new TextView(context);
			textView.setText(item.toString());
			textView.setGravity(Gravity.CENTER);
			return textView;
		} else {
			// 其他类型、根据需求情况写代码
			return new View(context);
		}

	}

	@Override
	public int getHeight(int row) {
		return rowHeight;
	}

	@Override
	public int getWidth(int column) {
		return colWidth;
	}

	public abstract String setData(View view, int row, int column);

	public abstract int getLayoutResource(int row, int column);
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值