利用TableLayout实现的类XLS表

简介:

转载请注明出处王亟亟向大牛之路努力!!
最近有一个私活是要做一个像XLS的表,然后里面可能还有一些算法和逻辑,网上找了点资料看了一些别人的代码,呈现给大家看,希望项目中用到的话可以派上用场。
先上图:
初始化的状态
这里写图片描述

输入内容计算结果
输入内容

添加行
这里写图片描述

初始化
这里写图片描述

表单属性:
Dict.java

public class Dict {

    private int id;
    private String name;
    private int number;
    private float price;
    private float totle;
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getNumber() {
        return number;
    }
    public void setNumber(int number) {
        this.number = number;
    }
    public float getPrice() {
        return price;
    }
    public void setPrice(float price) {
        this.price = price;
    }
    public float getTotle() {
        return totle;
    }
    public void setTotle(float totle) {
        this.totle = totle;
    }
}

填充数据DictDaoImpl

public class DictDaoImpl {

    public DictDaoImpl(Context context) {

    }

    public boolean isExist() {
        return false;
    }

    public List<Dict> getDictItem(String dictId) {
        String[] dicts = new String[5];
        List<Dict> retList = new ArrayList<Dict>();
        for (int j = 0; j < dicts.length; j++) {
            Dict dict = new Dict();
            dict.setName(dicts[j]);
            dict.setId(j+1);
//          dict.setOrders(j);
//          dict.setTypes(1000);
            retList.add(dict);
        }
        return retList;
    }

    public long insert(Dict entity) {
        return 1L;
    }

    public void delete(int id) {
    }

    public void update(Dict entity) {
    }

    public Dict get(Object id) {
        Dict dict = new Dict();
//      dict.setId(1);
//      dict.setName("华东");
//      dict.setOrders(1);
//      dict.setTypes(1000);
        return dict;
    }

    public void delete(Integer... ids) {
    }
}

主要实现的Activity
MainActivity

@SuppressLint("ResourceAsColor")
public class MainActivity extends Activity {

    private ImageView add, clear, save, back;
    private DisplayMetrics displayMetrics;
    private int entity_id = 0;
    private DictDaoImpl dao = null;
    private TableLayout table = null;
    private int id = 0; // 用户记录最大的orders值
    private TextView finalnumber, finaltotle;
    private int numberber = 0;
    private float totlele = 0;
    private Handler mhandler = null;
    private List<Dict> templist;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.dict_item);
        displayMetrics = new DisplayMetrics();
        (MainActivity.this).getWindowManager().getDefaultDisplay()
                .getMetrics(displayMetrics);
        // 实例化按钮并设置监听器.
        add = (ImageView) findViewById(R.id.add);
        clear = (ImageView) findViewById(R.id.clear);
        save = (ImageView) findViewById(R.id.save);
        back = (ImageView) findViewById(R.id.back);
        add.setOnClickListener(listener);
        clear.setOnClickListener(listener);
        save.setOnClickListener(listener);
        back.setOnClickListener(listener);
        entity_id = 1; // intent.getIntExtra(CrmConstances.ID, 0);

        table = (TableLayout) findViewById(R.id.dictTable);
        initDictItemTable();
        getfoottable();

    }

    OnClickListener listener = new OnClickListener() {

        @Override
        public void onClick(View v) {

            switch (v.getId()) {
            case R.id.add:
                appendNewRow(table);
                break;
            case R.id.clear:
                initDictItemTable();
                getfoottable();
                Toast.makeText(MainActivity.this, "重置成功", Toast.LENGTH_SHORT).show();
//              toast("重置成功");
                break;
            case R.id.save:

                break;
            case R.id.back:
                finish();
                break;
            default:
                break;
            }

        }
    };

    private void appendNewRow(final TableLayout table) {
        TableRow row = new TableRow(this);
        row.setId(0);
        id++;
        final Dict dict = new Dict();
        final EditText projectadd = new EditText(this);
        final EditText numberadd = new EditText(this);
        final EditText priceadd = new EditText(this);
        final EditText totleadd = new EditText(this);

        projectadd.setWidth(displayMetrics.widthPixels / 4);
//      projectadd.setLayoutParams(new LayoutParams(displayMetrics.widthPixels / 4, LayoutParams.WRAP_CONTENT));
        projectadd.setGravity(Gravity.LEFT);
        projectadd.setSingleLine(true);
        projectadd.setBackgroundResource(R.drawable.bg_city_search_normal);

        totleadd.setWidth(displayMetrics.widthPixels / 4);
//      totleadd.setLayoutParams(new LayoutParams(displayMetrics.widthPixels / 4, LayoutParams.WRAP_CONTENT));
        totleadd.setGravity(Gravity.LEFT);
        totleadd.setBackgroundResource(R.drawable.bg_city_search_normal);
        totleadd.setSingleLine(true);
        totleadd.setInputType(InputType.TYPE_NULL);

        priceadd.setWidth(displayMetrics.widthPixels / 4);
        priceadd.setGravity(Gravity.LEFT);
        priceadd.setBackgroundResource(R.drawable.bg_city_search_normal);
        priceadd.setSingleLine(true);
        priceadd.setInputType(InputType.TYPE_NUMBER_FLAG_DECIMAL
                | InputType.TYPE_CLASS_NUMBER);
        priceadd.addTextChangedListener(new TextWatcher() {

            @Override
            public void onTextChanged(CharSequence arg0, int arg1, int arg2,
                    int arg3) {
                if (!"".equals(priceadd.getText() + "")
                        && !"".equals(numberadd.getText() + "")) {
                    totleadd.setText(Float.parseFloat(arg0 + "")
                            * Integer.parseInt(numberadd.getText() + "") + "");
                    dict.setTotle(Float.parseFloat(totleadd.getText() + ""));
                    Message msg = new Message();
                    msg.what = 1;
                    msg.obj = list;
                    mhandler.sendMessage(msg);
                } else {
                    totleadd.setText("");
                    dict.setTotle(0);
                    Message msg = new Message();
                    msg.what = 1;
                    msg.obj = list;
                    mhandler.sendMessage(msg);
                }

            }

            @Override
            public void beforeTextChanged(CharSequence arg0, int arg1,
                    int arg2, int arg3) {

            }

            @Override
            public void afterTextChanged(Editable arg0) {

            }
        });

        numberadd.setWidth(displayMetrics.widthPixels / 4);
//      numberadd.setLayoutParams(new LayoutParams(displayMetrics.widthPixels / 4, LayoutParams.WRAP_CONTENT));
        numberadd.setGravity(Gravity.LEFT);
        numberadd.setBackgroundResource(R.drawable.bg_city_search_normal);
        numberadd.setSingleLine(true);
        numberadd.setInputType(InputType.TYPE_CLASS_NUMBER);
        numberadd.setFilters(new InputFilter[]{new InputFilter.LengthFilter(9)});
        numberadd.addTextChangedListener(new TextWatcher() {

            @Override
            public void onTextChanged(CharSequence arg0, int arg1, int arg2,
                    int arg3) {
                if (!"".equals(priceadd.getText() + "")
                        && !"".equals(numberadd.getText() + "")) {
                    totleadd.setText(Float.parseFloat(priceadd.getText() + "")
                            * Integer.parseInt(arg0 + "") + "");
                    dict.setTotle(Float.parseFloat(priceadd.getText() + "")
                            * Integer.parseInt(arg0 + ""));
                    Message msg = new Message();
                    msg.what = 1;
                    msg.obj = list;
                    mhandler.sendMessage(msg);
                } else {
                    totleadd.setText("");
                    dict.setTotle(0);
                    Message msg = new Message();
                    msg.what = 1;
                    msg.obj = list;
                    mhandler.sendMessage(msg);
                }

                if (!"".equals(numberadd.getText() + "")) {
                    dict.setNumber(Integer.parseInt(arg0 + ""));
                    Message msg = new Message();
                    msg.what = 1;
                    msg.obj = list;
                    mhandler.sendMessage(msg);

                } else {
                    dict.setNumber(0);
                    Message msg = new Message();
                    msg.what = 1;
                    msg.obj = list;
                    mhandler.sendMessage(msg);
                }


            }

            @Override
            public void beforeTextChanged(CharSequence arg0, int arg1,
                    int arg2, int arg3) {

            }

            @Override
            public void afterTextChanged(Editable arg0) {

            }
        });
        list.add(dict);
        row.addView(projectadd);
        row.addView(priceadd);
        row.addView(numberadd);
        row.addView(totleadd);
        table.addView(row, id);
    }

    List<Dict> list;

    @SuppressLint("ResourceAsColor")
    public void initDictItemTable() {
        if (dao == null) {
            dao = new DictDaoImpl(this);
        }

        list = new ArrayList<Dict>();
        if (entity_id != 0) {
            list = dao.getDictItem(String.valueOf(entity_id));
        }
        table.removeAllViews();

        TableRow row1 = new TableRow(this);

        TextView project1 = new TextView(this);
        project1.setText("项目");
        project1.setWidth(displayMetrics.widthPixels / 4);
        project1.setGravity(Gravity.CENTER);
        project1.setTextSize(18);
        project1.setTextColor(R.color.white);
        project1.setBackgroundColor(R.color.black);

        TextView price1 = new TextView(this);
        price1.setText("单价");
        price1.setWidth(displayMetrics.widthPixels / 4);
        price1.setGravity(Gravity.CENTER);
        price1.setTextSize(18);
        price1.setTextColor(R.color.white);
        price1.setBackgroundColor(R.color.black);

        TextView number1 = new TextView(this);
        number1.setText("数量");
        number1.setWidth(displayMetrics.widthPixels / 4);
        number1.setGravity(Gravity.CENTER);
        number1.setTextSize(18);
        number1.setTextColor(R.color.white);
        number1.setBackgroundColor(R.color.black);

        final TextView totle1 = new TextView(this);
        totle1.setText("金额");
        totle1.setWidth(displayMetrics.widthPixels / 4);
        totle1.setGravity(Gravity.CENTER);
        totle1.setTextSize(18);
        totle1.setTextColor(R.color.white);
        totle1.setBackgroundColor(R.color.black);

        // row1.addView(dictItemId1);
        row1.addView(project1);
        row1.addView(price1);
        row1.addView(number1);
        row1.addView(totle1);
        table.addView(row1);
        id = 0;
        for (final Dict dict : list) {
            id = Math.max(dict.getId(), id);// 取较大的作为新orders.
            TableRow row = new TableRow(this);
            row.setId(dict.getId());
            EditText project = new EditText(this);
            final EditText price = new EditText(this);
            final EditText number = new EditText(this);
            final EditText totle = new EditText(this);

            project.setWidth(displayMetrics.widthPixels / 4);
            project.setGravity(Gravity.LEFT);
            project.setSingleLine(true);
            project.setBackgroundResource(R.drawable.bg_city_search_normal);

            price.setWidth(displayMetrics.widthPixels / 4);
            price.setGravity(Gravity.LEFT);
            price.setBackgroundResource(R.drawable.bg_city_search_normal);
            price.setSingleLine(true);
            price.setInputType(InputType.TYPE_NUMBER_FLAG_DECIMAL
                    | InputType.TYPE_CLASS_NUMBER);
            price.addTextChangedListener(new TextWatcher() {

                @Override
                public void onTextChanged(CharSequence arg0, int arg1,
                        int arg2, int arg3) {
                    if (!"".equals(price.getText() + "")
                            && !"".equals(number.getText() + "")) {
                        totle.setText(Float.parseFloat(arg0 + "")
                                * Integer.parseInt(number.getText() + "") + "");
                        dict.setTotle(Float.parseFloat(arg0 + "")
                                * Integer.parseInt(number.getText() + ""));
                        Message msg = new Message();
                        msg.what = 1;
                        msg.obj = list;
                        mhandler.sendMessage(msg);
                    } else {
                        totle.setText("");
                        dict.setTotle(0);
                        Message msg = new Message();
                        msg.what = 1;
                        msg.obj = list;
                        mhandler.sendMessage(msg);
                    }


                }

                @Override
                public void beforeTextChanged(CharSequence arg0, int arg1,
                        int arg2, int arg3) {

                }

                @Override
                public void afterTextChanged(Editable arg0) {
                }

            });

            number.setWidth(displayMetrics.widthPixels / 4);
            number.setGravity(Gravity.LEFT);
            number.setBackgroundResource(R.drawable.bg_city_search_normal);
            number.setSingleLine(true);
            number.setInputType(InputType.TYPE_CLASS_NUMBER);
            number.setFilters(new InputFilter[]{new InputFilter.LengthFilter(9)});
            number.addTextChangedListener(new TextWatcher() {

                @Override
                public void onTextChanged(CharSequence arg0, int start,
                        int before, int count) {

                    if (!"".equals(price.getText() + "")
                            && !"".equals(number.getText() + "")) {
                        totle.setText(Float.parseFloat(price.getText() + "")
                                * Integer.parseInt(arg0 + "") + "");
                        dict.setTotle(Float.parseFloat(totle.getText() + ""));
                        Message msg = new Message();
                        msg.what = 1;
                        msg.obj = list;
                        mhandler.sendMessage(msg);

                    } else {
                        totle.setText("");
                        dict.setTotle(0);
                        Message msg = new Message();
                        msg.what = 1;
                        msg.obj = list;
                        mhandler.sendMessage(msg);
                    }
                    Log.w("111", start + "----" + before + "----" + count);
                    if (!"".equals(number.getText() + "")) {
                        dict.setNumber(Integer.parseInt(arg0 + ""));
                        Message msg = new Message();
                        msg.what = 1;
                        msg.obj = list;
                        mhandler.sendMessage(msg);
                    } else {
                        dict.setNumber(0);
                        Message msg = new Message();
                        msg.what = 1;
                        msg.obj = list;
                        mhandler.sendMessage(msg);
                    }



                }

                @Override
                public void beforeTextChanged(CharSequence arg0, int arg1,
                        int arg2, int arg3) {

                }

                @Override
                public void afterTextChanged(Editable arg0) {

                }
            });

            totle.setWidth(displayMetrics.widthPixels / 4);
            totle.setGravity(Gravity.LEFT);
            totle.setBackgroundResource(R.drawable.bg_city_search_normal);
            totle.setSingleLine(true);
            totle.setInputType(InputType.TYPE_NULL);

            row.addView(project);
            row.addView(price);
            row.addView(number);
            row.addView(totle);
            table.addView(row, new TableLayout.LayoutParams());
        }

    }

    private void getfoottable() {

        TableRow footrow = new TableRow(this);
        TextView finalname = new TextView(this);
        finaltotle = new TextView(this);
        finalnumber = new TextView(this);

        mhandler = new Handler() {
            @Override
            public void handleMessage(Message msg) {
                super.handleMessage(msg);
                if (msg.what == 1) {
                    numberber = 0;
                    totlele =0;
                    templist = (List<Dict>) msg.obj;
                    for (int i = 0; i < templist.size(); i++) {
                        numberber = numberber + templist.get(i).getNumber();
                        totlele = totlele +templist.get(i).getTotle();
                    }
                    finalnumber.setText(numberber + "");
                    finaltotle.setText(totlele+"");
                }
            }
        };

        finalname.setText("合计");
        finalname.setWidth(displayMetrics.widthPixels / 4);
        finalname.setGravity(Gravity.CENTER);
        finalname.setTextSize(18);
        finalname.setTextColor(R.color.white);
        finalname.setBackgroundColor(R.color.black);

        TextView finalname1 = new TextView(this);
        finalname1.setWidth(displayMetrics.widthPixels / 4);
        finalname1.setTextSize(18);
        finalname1.setTextColor(R.color.white);
        finalname1.setBackgroundColor(R.color.black);

        finalnumber.setWidth(displayMetrics.widthPixels / 4);
        finalnumber.setGravity(Gravity.LEFT);
        finalnumber.setBackgroundResource(R.drawable.bg_city_search_normal);
        finalnumber.setSingleLine(true);
        finalnumber.setTextSize(18);

        finaltotle.setWidth(displayMetrics.widthPixels / 4);
        finaltotle.setGravity(Gravity.LEFT);
        finaltotle.setTextSize(18);
        finaltotle.setBackgroundResource(R.drawable.bg_city_search_normal);
        finaltotle.setSingleLine(true);

        footrow.addView(finalname);
        footrow.addView(finalname1);
        footrow.addView(finalnumber);
        footrow.addView(finaltotle);

        table.addView(footrow, id + 1, new TableLayout.LayoutParams());
    }


}

布局文件dict_item

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="44dp"
        android:background="@color/black"
        android:gravity="center_vertical"
        android:orientation="horizontal" >

        <LinearLayout
            android:id="@+id/app_back_click"
            android:layout_width="112dp"
            android:layout_height="match_parent"
            android:background="#0000"
            android:gravity="center_vertical"
            android:orientation="horizontal"
            android:paddingLeft="6dp"
            android:visibility="visible" >

            <ImageView
                android:id="@+id/back"
                android:layout_width="24dp"
                android:layout_height="24dp"
                android:layout_marginLeft="4dp"
                android:src="@drawable/icon_back" />

            <TextView
                android:id="@+id/app_title_tv_left"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginLeft="4dp"
                android:gravity="center"
                android:singleLine="true"
                android:text="返回"
                android:textColor="#ffffff"
                android:textSize="16sp"
                android:visibility="gone" />
        </LinearLayout>

        <TextView
            android:id="@+id/app_title"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:ellipsize="marquee"
            android:focusable="true"
            android:focusableInTouchMode="true"
            android:gravity="center"
            android:marqueeRepeatLimit="marquee_forever"
            android:singleLine="true"
            android:text="例子哈哈"
            android:textColor="#ffffff"
            android:textSize="20sp" />

        <LinearLayout
            android:id="@+id/app_add_click"
            android:layout_width="132dp"
            android:layout_height="match_parent"
            android:background="#0000"
            android:gravity="center_vertical|right"
            android:orientation="horizontal"
            android:paddingRight="6dp"
            android:visibility="visible" >

            <ImageView
                android:id="@+id/add"
                android:layout_width="28dp"
                android:layout_height="28dp"
                android:layout_marginRight="15dp"
                android:src="@drawable/app_title_add" />

            <ImageView
                android:id="@+id/clear"
                android:layout_width="28dp"
                android:layout_height="28dp"
                android:layout_marginRight="15dp"
                android:src="@drawable/white_rubbish_normal" />

            <ImageView
                android:id="@+id/save"
                android:layout_width="28dp"
                android:layout_height="28dp"
                android:layout_marginRight="4dp"
                android:src="@drawable/icon_save" />
        </LinearLayout>
    </LinearLayout>

    <ScrollView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:scrollbars="none" >

        <LinearLayout
            android:id="@+id/dictLayout"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:orientation="vertical"
            android:scrollbars="" >

            <TableLayout
                android:id="@+id/dictTable"
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:layout_marginLeft="6dp"
                android:layout_marginRight="6dp"
                android:layout_marginTop="8dp" >

                <TableRow>

                    <TextView
                        android:layout_width="60dp"
                        android:layout_gravity="left"
                        android:padding="3dip"
                        android:text="序号"
                        android:textStyle="bold" />

                    <TextView
                        android:layout_gravity="center"
                        android:padding="3dip"
                        android:text="字典名称"
                        android:textStyle="bold" />

                    <TextView
                        android:layout_gravity="right"
                        android:padding="3dip"
                        android:text=" 操作 "
                        android:textStyle="bold" />
                </TableRow>
            </TableLayout>
        </LinearLayout>
    </ScrollView>

</LinearLayout>

具体的实例 可以看例子 源码链接
访问密码 46aa
有问题欢迎+Q 452270579联系交流,谢谢

目录
相关文章
|
9月前
|
搜索推荐 Python
使用Python自动化生成物业通知单
本文介绍如何使用Python结合Pandas和python-docx库自动化生成物业通知单。通过读取Excel数据并填充至Word模板,实现高效准确的通知单批量制作。包括环境准备、代码解析及效果展示,适用于物业管理场景。
208 14
|
9月前
|
敏捷开发 数据可视化 数据挖掘
"智慧办公,从使用板栗看板开始"
板栗看板是一款基于看板管理理念的协同软件,提供直观的视觉平台,助力团队高效管理任务、跟踪进度和沟通。其核心特点包括可视化任务管理、灵活的工作流程、实时更新与通知、协同功能及数据分析,适用于项目管理、敏捷开发、跨部门协作等场景,有效提升团队效率。
|
11月前
|
监控 数据可视化 关系型数据库
开发者如何使用云数据库 SelectDB 版
【10月更文挑战第20天】开发者如何使用云数据库 SelectDB 版
187 0
|
机器学习/深度学习 数据采集 数据可视化
【Python 机器学习专栏】数据缺失值处理与插补方法
【4月更文挑战第30天】本文探讨了Python中处理数据缺失值的方法。缺失值影响数据分析和模型训练,可能导致模型偏差、准确性降低和干扰分析。检测缺失值可使用Pandas的`isnull()`和`notnull()`,或通过可视化。处理方法包括删除含缺失值的行/列及填充:固定值、均值/中位数、众数或最近邻。Scikit-learn提供了SimpleImputer和IterativeImputer类进行插补。选择方法要考虑数据特点、缺失值比例和模型需求。注意过度插补和验证评估。处理缺失值是提升数据质量和模型准确性关键步骤。
1056 0
|
安全 网络安全
渗透测试之0day介绍
渗透测试之0day介绍
591 0
|
虚拟化 Python 容器
python虚拟环境的安装和搭建
通俗的来讲,虚拟环境就是借助虚拟机来把一部分内容独立出来,我们把这部分独立出来的东西称作“容器”,在这个容器中,我们可以只安装我们需要的依赖包,各个容器之间互相隔离,互不影响。
604 0
python虚拟环境的安装和搭建
|
弹性计算 人工智能 负载均衡
什么是阿里云服务器?云服务器的优缺点
阿里云是阿里巴巴集团的旗舰云计算品牌,它为全球各种规模的企业提供了云计算服务。阿里云服务器是阿里云的一项核心业务,它是一种可靠的云服务解决方案,具有许多优势。
894 0
|
存储 移动开发
An2021软件安装及基本操作(新建文件/导出)
An2021软件安装及基本操作(新建文件/导出)
984 0
An2021软件安装及基本操作(新建文件/导出)
|
机器学习/深度学习 存储 边缘计算
为什么深度学习需要与边缘计算进行结合?如何结合?
为什么深度学习需要与边缘计算进行结合?如何结合?
653 0
为什么深度学习需要与边缘计算进行结合?如何结合?

热门文章

最新文章