android自定义表格布局

本文介绍了一种使用纯代码方式实现表格布局的方法,包括一对一和一对多表格,并提供了详细的代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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




评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值