最近由于项目需要,要求将服务器返回来的Json数组以表格的形式去存放,取代之前的ListView,苦想了一天后,又借鉴了一些大神们的代码,加上自己的一些理解封闭了一个纯代码表格类,先看一对一表格效果图:
完全与网站上的表格效果是一致的,下面再看一再一对多表格的效果图:
.
话不多说:将自己封装好的表格类代码贴上:
package com.micen.buyers.view.productdetail;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import android.content.Context;
import android.graphics.drawable.Drawable;
import android.text.Html;
import android.util.AttributeSet;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TableLayout;
import android.widget.TextView;
import com.micen.buyers.activity.R;
import com.micen.buyers.adapter.PriceTableAdapter;
import com.micen.buyers.module.product.ProductKeyValuePair;
import com.micen.buyers.util.Util;
public class NormalTableLayout extends TableLayout
{
//UI组件
private LinearLayout viewGroup;
private View tableTitleDivider;
private TextView tableTitle;
public TableLayout tableContent;
private View tableFooter;
private Context context;
/**
* 声明长宽
*/
private static final int WC = ViewGroup.LayoutParams.WRAP_CONTENT;
private static final int FP = ViewGroup.LayoutParams.MATCH_PARENT;
/**
*数据属性,单位均为dp
*/
private ArrayList<ProductKeyValuePair> list;
private HashMap<String, ArrayList<ProductKeyValuePair>> map;
private HashMap<String, Object> styleList;
private ArrayList<String> importantList;
private String title;
private boolean important;
private boolean hasFilter;
private int leftTableWidth;
private int rightTableWidth;
private int dividerHeight;
private PriceTableAdapter adapter;
/**
* 样式属性
* @param context
*/
private int dividerColor;
private int forwardColor;
private int leftTextColor;
private int rightTextColor;
private int importantColor;
private int leftTextSize;
private int rightTextSize;
private int paddingTop;
private int paddingBottom;
private int leftGravity;
private int rightGravity;
private Drawable dividerDrawable;
/**
* 表格标题属性,可设可不设,不设则无标题
* @param context
*/
private int titleHeight;
private int titleWeight;
private int titleBackground;
private int titlePaddingLeft;
private int titleTextSize;
/**
* 单元格点击事件处理,可以根据自己的需求添加不同的事件处理
* @param context
*/
private OnClickListener clickListener;
public NormalTableLayout(Context context)
{
this(context, null);
}
public NormalTableLayout(Context context, AttributeSet attrs)
{
super(context, attrs);
initView(context);
initData();
initStyle();
}
/**
* 初始化默认属性
*/
private void initStyle()
{
dividerColor = context.getResources().getColor(R.color.mic_menu_line);
dividerDrawable = context.getResources().getDrawable(R.color.mic_menu_line);
forwardColor = context.getResources().getColor(R.color.mic_white);
leftTextColor = context.getResources().getColor(R.color.mic_home_menu_text);
importantColor = context.getResources().getColor(R.color.get_last_price_normal);
rightTextColor = context.getResources().getColor(R.color.search_list_item_left);
leftTextSize = rightTextSize = 12;
paddingBottom = paddingTop = Util.dip2px(12);
leftGravity = Gravity.RIGHT;
rightGravity = -1;
/**
* 标题属性
*/
titleBackground = context.getResources().getColor(R.color.setting_bg_color);
titleWeight = FP;
titleHeight = Util.dip2px(29);
titleTextSize = 15;
dividerHeight = Util.dip2px(0.5f);
titlePaddingLeft = Util.dip2px(15);
}
/**
* 初始化数据属性
*/
private void initData()
{
hasFilter = true;
list = new ArrayList<ProductKeyValuePair>();
styleList = new HashMap<String, Object>();
importantList = new ArrayList<String>();
}
/**
* 初始化UI组件
* @param context
*/
private void initView(Context context)
{
this.context = context;
viewGroup = (LinearLayout) LayoutInflater.from(context).inflate(R.layout.my_table_layout, null);
tableTitleDivider = (View) viewGroup.findViewById(R.id.table_title_didiver);
tableTitle = (TextView) viewGroup.findViewById(R.id.table_title);
tableContent = (TableLayout) viewGroup.findViewById(R.id.table_content);
tableFooter = (View) viewGroup.findViewById(R.id.table_footer_divider);
addView(viewGroup);
}
/**
* 初始化一些变量值
* @param pairs
* @param title
* @param width
*/
public void initParams(ArrayList<ProductKeyValuePair> pairs, String title, int leftTableWidth)
{
this.list = pairs;
this.title = title;
this.leftTableWidth = leftTableWidth;
this.rightTableWidth = leftTableWidth * 2;
}
public void initParams(HashMap<String, ArrayList<ProductKeyValuePair>> map, String title, int leftTableWidth)
{
this.map = map;
this.title = title;
this.leftTableWidth = leftTableWidth;
this.rightTableWidth = leftTableWidth * 2;
}
/**
* 属性get,set方法
* @return
*/
public ArrayList<ProductKeyValuePair> getList()
{
return list;
}
public void setList(ArrayList<ProductKeyValuePair> list)
{
this.list = list;
}
public String getTitle()
{
return title;
}
public void setTitle(String title)
{
this.title = title;
}
/**
* 添加一组数据集合
* @param collection
*/
public void addList(ArrayList<ProductKeyValuePair> collection)
{
if (this.list != null)
{
if (collection != null && collection.size() > 0)
{
this.list.addAll(collection);
}
}
}
/**
*声明表格重要数据,以特别的颜色显示
* @return
*/
public ArrayList<String> getImportantList()
{
return importantList;
}
public void setImportantList(ArrayList<String> importantList)
{
this.importantList = importantList;
}
public void addImportantList(ArrayList<String> collection)
{
if (this.importantList != null)
{
if (collection != null && collection.size() > 0)
{
this.importantList.addAll(collection);
}
}
}
/**
* 添加重要数据
* @param collection
*/
public void addImportant(String importantItem)
{
if (this.importantList != null)
{
this.importantList.add(importantItem);
}
}
public void setDividerColor(int dividerColor)
{
this.dividerColor = dividerColor;
}
public void setForwardColor(int forwardColor)
{
this.forwardColor = forwardColor;
}
public void setLeftTextColor(int leftTextColor)
{
this.leftTextColor = leftTextColor;
}
public void setRightTextColor(int rightTextColor)
{
this.rightTextColor = rightTextColor;
}
/**
*设置重要数据的显示颜色
* @param importantColor
*/
public void setImportantColor(int importantColor)
{
this.importantColor = importantColor;
}
public void setLeftTextSize(int leftTextSize)
{
this.leftTextSize = leftTextSize;
}
public void setRightTextSize(int rightTextSize)
{
this.rightTextSize = rightTextSize;
}
public void setPaddingTop(int paddingTop)
{
this.paddingTop = paddingTop;
}
public void setPaddingBottom(int paddingBottom)
{
this.paddingBottom = paddingBottom;
}
public void setRightTableWidth(int rightTableWidth)
{
this.rightTableWidth = rightTableWidth;
}
public void setLeftTableWidth(int leftTableWidth)
{
this.leftTableWidth = leftTableWidth;
}
public void setHasFilter(boolean hasFilter)
{
this.hasFilter = hasFilter;
}
public void setDividerHeight(int dividerHeight)
{
this.dividerHeight = dividerHeight;
}
public void setLeftGravity(int leftGravity)
{
this.leftGravity = leftGravity;
}
public void setRightGravity(int rightGravity)
{
this.rightGravity = rightGravity;
}
public void setTitleHeight(int titleHeight)
{
this.titleHeight = titleHeight;
}
public void setTitleWeight(int titleWeight)
{
this.titleWeight = titleWeight;
}
public void setTitleBackground(int titleBackground)
{
this.titleBackground = titleBackground;
}
public void setTitlePaddingLeft(int titlePaddingLeft)
{
this.titlePaddingLeft = titlePaddingLeft;
}
public void setTitleTextSize(int titleTextSize)
{
this.titleTextSize = titleTextSize;
}
public void setDividerDrawable(Drawable dividerDrawable)
{
this.dividerDrawable = dividerDrawable;
}
public void setMap(HashMap<String, ArrayList<ProductKeyValuePair>> map)
{
this.map = map;
}
/**
* 事件处理回调方法
*/
public void setClickListener(OnClickListener clickListener)
{
this.clickListener = clickListener;
}
/**
*绘制一对一表格
*/
public void createOne2OneTable()
{
if (title != null && title.length() > 0 && title != "")
{
resetTitle();
}
else
{
hideTitle();
}
if (list != null && list.size() > 0)
{
for (ProductKeyValuePair pair : list)
{
if (pair.value.toString() != null && pair.value.toString().trim().length() > 0)
{
if (importantList.contains(pair.key))
{
important = true;
}
else
{
important = false;
}
tableContent.addView(createTableItem(pair.key + (hasFilter ? ":" : ""), pair.value.toString()));
}
else
{
continue;
}
}
}
else
{
/**
* �������������Ҳ����
*/
tableFooter.setVisibility(View.GONE);
hideTitle();
}
}
/**
* 重置表格标题
*/
private void resetTitle()
{
tableTitle.setText(title);
tableTitle.setBackgroundColor(titleBackground);
LinearLayout.LayoutParams title_params = new LinearLayout.LayoutParams(titleWeight, titleHeight);
tableTitle.setLayoutParams(title_params);
tableTitle.setTextSize(titleTextSize);
LinearLayout.LayoutParams title_divider_params = new LinearLayout.LayoutParams(titleWeight, dividerHeight);
tableTitleDivider.setLayoutParams(title_divider_params);
tableTitle.setPadding(titlePaddingLeft, 0, 0, 0);
}
public void hideTitle()
{
tableTitle.setVisibility(View.GONE);
tableTitleDivider.setVisibility(View.GONE);
}
public void showTitle()
{
tableTitle.setVisibility(View.VISIBLE);
tableTitleDivider.setVisibility(View.VISIBLE);
}
/**
* 删除表格旧数据
*/
public void removeOldData()
{
if (tableContent.getChildCount() > 0)
{
tableContent.removeAllViews();
}
}
/**
*绘制一对一表格每一项
* @param text1
* @param text2
* @return
*/
private LinearLayout createTableItem(String text1, String text2)
{
LinearLayout layout_outer = new LinearLayout(context);
layout_outer.setBackgroundColor(dividerColor);
layout_outer.setPadding(0, dividerHeight, dividerHeight, 0);
LinearLayout layout_inner = new LinearLayout(context);
layout_inner.setBackgroundColor(forwardColor);
layout_inner.setOrientation(LinearLayout.HORIZONTAL);
TextView tv1 = new TextView(context);
LinearLayout.LayoutParams tv_params = new LinearLayout.LayoutParams(leftTableWidth, WC);
tv1.setText(Html.fromHtml(text1));
tv1.setLayoutParams(tv_params);
tv1.setTextSize(leftTextSize);
tv1.setTextColor(leftTextColor);
tv1.setGravity(leftGravity);
tv1.setPadding(0, paddingTop, Util.dip2px(9), paddingBottom);
ImageView view = new ImageView(context);
LinearLayout.LayoutParams view_params = new LinearLayout.LayoutParams(dividerHeight, FP);
view.setLayoutParams(view_params);
view.setBackgroundColor(dividerColor);
TextView tv2 = new TextView(context);
LinearLayout.LayoutParams tv_params_2 = new LinearLayout.LayoutParams(rightTableWidth, WC);
tv2.setText(Html.fromHtml(Util.replaceHtmlStr(text2)));
tv2.setLayoutParams(tv_params_2);
tv2.setTextSize(rightTextSize);
tv2.setTextColor(important ? importantColor : rightTextColor);
if (rightGravity != -1)
{
tv2.setGravity(rightGravity);
}
if (important)
{
tv2.setOnClickListener(clickListener);
}
tv2.setPadding(Util.dip2px(9), paddingTop, Util.dip2px(15), paddingBottom);
layout_inner.addView(tv1);
layout_inner.addView(view);
layout_inner.addView(tv2);
layout_outer.addView(layout_inner);
return layout_outer;
}
/**
*绘制一对多表格
*/
public void createOne2ManyTable()
{
if (title != null && title.length() > 0 && title != "")
{
resetTitle();
}
else
{
hideTitle();
}
if (map != null && map.size() > 0)
{
Iterator iter = map.entrySet().iterator();
while (iter.hasNext())
{
Map.Entry entry = (Map.Entry) iter.next();
tableContent.addView(createTableItem(entry.getKey().toString(),
(ArrayList<ProductKeyValuePair>) entry.getValue()));
}
}
else
{
hideTitle();
}
tableFooter.setVisibility(View.GONE);
}
/**
*利用ListView表格绘制一对多表格
*/
public LinearLayout createTableItem(String text1, ArrayList<ProductKeyValuePair> tempList)
{
LinearLayout layout_outer = new LinearLayout(context);
layout_outer.setBackgroundColor(dividerColor);
layout_outer.setPadding(0, dividerHeight, 0, 0);
LinearLayout layout_inner = new LinearLayout(context);
layout_inner.setBackgroundColor(forwardColor);
layout_inner.setOrientation(LinearLayout.HORIZONTAL);
TextView tv1 = new TextView(context);
LinearLayout.LayoutParams tv_params = new LinearLayout.LayoutParams(leftTableWidth, WC);
tv1.setText(text1);
tv1.setLayoutParams(tv_params);
tv1.setTextSize(leftTextSize);
tv1.setTextColor(leftTextColor);
tv1.setGravity(leftGravity);
tv1.setPadding(0, paddingTop, Util.dip2px(9), 0);
ImageView view = new ImageView(context);
LinearLayout.LayoutParams view_params = new LinearLayout.LayoutParams(dividerHeight, FP);
view.setLayoutParams(view_params);
view.setBackgroundColor(dividerColor);
ProductDetailListView listView = new ProductDetailListView(context);
LinearLayout.LayoutParams list_params = new LinearLayout.LayoutParams(rightTableWidth, WC);
listView.setLayoutParams(list_params);
listView.setClickable(false);
listView.setCacheColorHint(R.color.transparent);
listView.setSelector(R.color.transparent);
listView.setDivider(dividerDrawable);
listView.setDividerHeight(dividerHeight);
sendParamsToAdapter();
adapter = new PriceTableAdapter(context, tempList, styleList);
listView.setAdapter(adapter);
Util.setListViewHeightBasedOnChildren(listView);
layout_inner.addView(tv1);
layout_inner.addView(view);
layout_inner.addView(listView);
layout_outer.addView(layout_inner);
return layout_outer;
}
private void sendParamsToAdapter()
{
styleList.put("rightTextColor", rightTextColor);
styleList.put("dividerColor", dividerColor);
styleList.put("rightTextSize", rightTextSize);
}
}
思路:一对一表格的实现思路就是先写一个一对一单元格的方法,封装好后,根据外部传来的集合执行一次遍历,调用绘制一对一表格的方法,即可将整个表格绘制出来,一对一表格的详细实现步骤请看代码,不是很难,只是有点烦锁.一对多表格则多的一方要借助ListView来完成,通过为ListView的Item设置不同的数量来实现多列的效果.