最近由于项目需要,要求将服务器返回来的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设置不同的数量来实现多列的效果.

android自定义表格布局相关推荐

  1. android自定义table,Android 自定义表格控件

    Android 自定义表格控件 发布时间:2018-08-20 17:07, 浏览次数:487 , 标签: Android 1.简介 tabview是一款开源表格控件,可以通过xml属性设置行列数.设 ...

  2. android标签table,详解Android TableLayout表格布局

    表格布局的标签是TableLayout,TableLayout继承了LinearLayout.所以它依然是一个线性布局. 前言: 1.TableLayout简介 2.TableLayout行列数的确定 ...

  3. Android自定义动态布局 — 多图片上传

    Android自定义动态布局 - 多图片上传 本文介绍Android中动态布局添加图片,多图片上传. 项目中效果图:    技术点: 1.动态添加格局中的线条和添加图片的+号 2.多张图片异步上传 首 ...

  4. Android用表格布局做菜单栏,Android开发菜单布局之表格布局示例

    本文实例讲述了android开发菜单布局之表格布局.分享给大家供大家参考,具体如下: 多用于静态菜单页面 xml代码 代码内带详细解释 xmlns:android="http://schem ...

  5. android 自定义输入法布局,Android自定义输入法使用方法

    Android自定义输入法使用方法 时间:2017-04-21     来源:Android开发学习网 对于Android用户而言,一般都会使用第三方的输入法.可是在输入密码时(尤其是支付相关的密码) ...

  6. Android 自定义圆角布局

    在android 开发中,图片或者button 有圆角的布局显得格外的美观些,所以今天就来 自定义圆角布局,只要把控件放入圆角布局中,然后设置属性就能实现圆角布局样式 接下来就来实现这样的功能 效果图 ...

  7. Android自定义组合布局,Android 流式布局 + 自定义组合控件

    自定义组合控件 package yanjupeng.bawei.com.day09.two; import android.content.Context; import android.util.A ...

  8. android 自定义布局 根据布局获取类,阿里高级Android面试题解析:Android自定义View—布局过程的自定义...

    自定义分三部分绘制.布局和触摸反馈,本篇主要讲的布局过程的自定义 布局过程的含义 布局过程,就是程序在运行时利用布局文件的代码来计算出实际尺寸的过程. 布局过程的工作内容 两个阶段:测量阶段和布局阶段 ...

  9. android 自定义输入法布局,Android InputMethodService|KeyboardView 自定义输入法和键盘 01...

    如何自定义 安卓输入法 和 键盘 1.首先有几个关键类 1.InputMethodService 2.Keyboard 3.KeyboardView 1.1 InputMethodService 看下 ...

  10. Android 自定义表格控件

    1.简介 tabview是一款开源表格控件,可以通过xml属性设置行列数.设置表格标题.内容以及表头,对每行可以做点击事件处理. 2.引入 ps:不知道为什么bintray服务器总是异常,所以使用gr ...

最新文章

  1. uniapp中遮罩穿透问题
  2. 怎么安装python3-Ubuntu16.04怎样安装Python3.6
  3. 不需要网络的调频收音机_测试工程师真的不需要懂网络知识么?
  4. 使用TI 的低功耗C5x DSP的指纹识别方框图和解决方
  5. CSS 让数字滑动显示
  6. 【转】MS SQL Sever 远程安装导入数据演示(图)
  7. c语言程序设计李泽中课后,C语言程序设计李泽中课件第4章解读.ppt
  8. 如何对第一个值相同的列表中的元组求和
  9. 实验记录一 初步接触cortex-M3
  10. 水经注地图发布服务中间件下载安装图文教程
  11. Gitlab-IDEA使用教程
  12. ORA-12162: TNS:net service name is incorrectly specified 错误解决
  13. 如何注册网站域名?需要注意哪些事项?
  14. matlab之运动目标检测
  15. 计算机无法识别3.0u盘启动,USB3.0接口不能识别U盘怎么办
  16. 2022-2028年中国特种食用油行业市场运营格局及前景战略分析报告
  17. task03 字符识别模型
  18. 安装lamp服务器系统,LAMP安装环境搭建详解
  19. Elasticsearch搜索辅助功能解析(十)
  20. 基于自然地理要素的全球土地宜垦性数据

热门文章

  1. 开源API网关系统:Kong简介
  2. 论文笔记_S2D.24_2014-ECCV_LSD-SLAM: 基于直接法的大范围单目即时定位和地图构建方法
  3. 1040 有几个PAT
  4. 基于TensorRT完成NanoDet模型部署
  5. 刚刚!老干妈发布警方通报:3人伪造印章与腾讯签协议已刑拘,腾讯:辣椒酱不香了...
  6. GS3D An Efficient 3D Object Detection Framework for Autonomous Driving算法解析
  7. eclipse提交代码到github其他分支
  8. spring5之容器始末源码赏析 (一)总览
  9. 箭头函数和Buffer对象
  10. SQL点点滴滴_常用函数