android自定义表格布局

来源:互联网 发布:qq的网络传输协议 编辑:程序博客网 时间:2024/06/06 09:39

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




0 0
原创粉丝点击