要实现的效果举例:
方法一:遍历数据集,在代码中动态添加布局,设置布局的相关属性。
缺点:单元格中布局复杂的情况下繁琐
方法二,需要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);
}