Android使用TableLayou动态布局实例

实现主要功能:

* 1.使用TableLayout动态布局展示,可动态添加和删除.
* 2.初始化时显示动态展示,初始化的数据改造后可来自数据库.
* 3.重置时到初始化状态.
* 4.保存时去重检查,参见代码中去重算法.

 

首先,建立实体类:

package tgb.lk.tablelayout;  
  
public class Dict {  
  
    private int id;  
    private String name;  
    private int orders;  
    private String desc;  
    private int types;  
      
    //get,set方法.   
  
    @Override  
    public String toString() {  
        return "Dict [id=" + id + ", name=" + name + ", orders=" + orders  
                + ", types=" + types + "]";  
    }  
  
}  


其次,建立数据层方法接口:

package tgb.lk.tablelayout;  
      
    import java.util.ArrayList;  
    import java.util.List;  
      
    import android.content.Context;  
      
    public class DictDaoImpl {  
      
        public DictDaoImpl(Context context) {  
      
        }  
      
        public boolean isExist() {  
            return false;  
        }  
      
        public List<Dict> getDictItem(String dictId) {  
            String[] dicts = new String[] { "华东", "华南", "华北", "华中", "西南", "东北" };  
            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);  
                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) {  
        }  
    }


然后,建立layout布局dict_item.xml:

<?xml version="1.0" encoding="utf-8"?>  
    <ScrollView xmlns:android="http://schemas.android.com/apk/res/android"  
        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="" >  
      
            <TextView  
                android:id="@+id/title"  
                android:layout_width="fill_parent"  
                android:layout_height="wrap_content"  
                android:text="业务字典管理" />  
      
            <LinearLayout  
                android:layout_width="fill_parent"  
                android:layout_height="wrap_content"  
                android:orientation="horizontal" >  
      
                <TextView  
                    android:layout_width="80dp"  
                    android:layout_height="wrap_content"  
                    android:text="名称:" />  
      
                <EditText  
                    android:id="@+id/name"  
                    android:layout_width="200dp"  
                    android:layout_height="wrap_content"  
                    android:hint="请输入业务字典名称"  
                    android:maxLength="20"  
                    android:singleLine="true" />  
            </LinearLayout>  
      
            <TableLayout  
                android:id="@+id/dictTable"  
                android:layout_width="fill_parent"  
                android:layout_height="wrap_content"  
                android:stretchColumns="1" >  
      
                <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  
                android:layout_width="fill_parent"  
                android:layout_height="wrap_content"  
                android:gravity="right"  
                android:orientation="horizontal" >  
      
                <Button  
                    android:id="@+id/btnCancel"  
                    android:layout_width="wrap_content"  
                    android:layout_height="wrap_content"  
                    android:layout_margin="8dp"  
                    android:text=" 关 闭 " />  
      
                <Button  
                    android:id="@+id/btnReset"  
                    android:layout_width="wrap_content"  
                    android:layout_height="wrap_content"  
                    android:layout_margin="8dp"  
                    android:text=" 重 置 " />  
      
                <Button  
                    android:id="@+id/btnAdd"  
                    android:layout_width="wrap_content"  
                    android:layout_height="wrap_content"  
                    android:layout_margin="8dp"  
                    android:text=" 添 加 " />  
      
                <Button  
                    android:id="@+id/btnOK"  
                    android:layout_width="wrap_content"  
                    android:layout_height="wrap_content"  
                    android:layout_margin="8dp"  
                    android:text=" 保 存 " />  
            </LinearLayout>  
        </LinearLayout>  
      
    </ScrollView>


最后,建立逻辑主类:

package tgb.lk.tablelayout;  
      
    import java.util.ArrayList;  
    import java.util.HashMap;  
    import java.util.List;  
    import java.util.Map;  
      
    import android.app.Activity;  
    import android.content.Intent;  
    import android.os.Bundle;  
    import android.text.TextUtils;  
    import android.view.Gravity;  
    import android.view.View;  
    import android.view.View.OnClickListener;  
    import android.widget.Button;  
    import android.widget.EditText;  
    import android.widget.TableLayout;  
    import android.widget.TableRow;  
    import android.widget.TextView;  
    import android.widget.Toast;  
      
    /** 
     * 实现功能:  
     * 1.使用TableLayout动态布局展示,可动态添加和删除. 
     * 2.初始化时显示动态展示,初始化的数据改造后可来自数据库.  
     * 3.重置时到初始化状态. 
     * 4.保存时去重检查,参见代码中去重算法. 
     *  
     * @author likun date: 2012-04-07 
     */  
    public class MainActivity extends Activity {  
        private Button btnAdd = null;  
        private Button btnOK = null;  
        private Button btnReset = null;  
        private Button btnCancel = null;  
      
        private EditText nameET = null;  
      
        private int entity_id = 0;  
        private String entity_name = "";  
      
        private DictDaoImpl dao = null;  
        private TableLayout table = null;  
        private int orders = 0; // 用户记录最大的orders值   
      
        @Override  
        protected void onCreate(Bundle savedInstanceState) {  
            super.onCreate(savedInstanceState);  
            setContentView(R.layout.dict_item);  
      
            // 实例化按钮并设置监听器.   
            btnAdd = (Button) findViewById(R.id.btnAdd);  
            btnOK = (Button) findViewById(R.id.btnOK);  
            btnReset = (Button) findViewById(R.id.btnReset);  
            btnCancel = (Button) findViewById(R.id.btnCancel);  
      
            btnAdd.setOnClickListener(listener);  
            btnOK.setOnClickListener(listener);  
            btnReset.setOnClickListener(listener);  
            btnCancel.setOnClickListener(listener);  
      
            // 实例化EditText   
            nameET = (EditText) findViewById(R.id.name);  
      
            // Intent intent = getIntent();   
      
            entity_id = 1; // intent.getIntExtra(CrmConstances.ID, 0);   
            entity_name = "区域";// intent.getStringExtra(CrmConstances.NAME);   
      
            nameET.setText(entity_name);  
      
            table = (TableLayout) findViewById(R.id.dictTable);  
      
            initDictItemTable();  
        }  
      
        OnClickListener listener = new OnClickListener() {  
      
            @Override  
            public void onClick(View v) {  
      
                switch (v.getId()) {  
                case R.id.btnAdd:  
                    appendNewRow(table);  
                    break;  
                case R.id.btnOK:  
                    // 组名称不能为空.   
                    if (TextUtils.isEmpty(nameET.getText().toString().trim())) {  
                        toastShow("名称不能为空,操作失败!");  
                        nameET.requestFocus(); // 设定焦点   
                        break;  
                    }  
                    if (dao == null) {  
                        dao = new DictDaoImpl(MainActivity.this);  
                    }  
      
                    String entityNameET = nameET.getText().toString().trim();  
      
                    if (entity_id != 0) {  
                        Dict entity = dao.get(entity_id);  
                        // 组名发生改变时,判断组名称是否重复   
                        if (!entity.getName().equals(entityNameET)) {  
                            if (dao.isExist()) {  
                                toastShow("名称[" + entityNameET + "]重复,操作失败!");  
                                nameET.selectAll();  
                                nameET.requestFocus();  
                                break;  
                            }  
                            entity.setName(entityNameET);  
                            dao.update(entity);  
                        }  
      
                        Map<String, Dict> dictMap = new HashMap<String, Dict>();  
                        List<Dict> dictAddList = new ArrayList<Dict>();  
                        List<Dict> dictUpdateList = new ArrayList<Dict>();  
                        List<Dict> dictDeleteList = new ArrayList<Dict>();  
                        Map<String, String> map = new HashMap<String, String>();  
                        // 从界面得到业务字典对象   
                        for (int i = 1; i < table.getChildCount(); i++) {  
                            // 得到TableRow对象   
                            TableRow row = (TableRow) table.getChildAt(i);  
                            String dictId = ((TextView) row.getChildAt(0))  
                                    .getText().toString();  
                            String dictOrders = ((EditText) row.getChildAt(1))  
                                    .getText().toString();  
                            String dictName = ((EditText) row.getChildAt(2))  
                                    .getText().toString();  
      
                            // 构建Dict对象   
                            Dict dict = new Dict();  
                            if (!TextUtils.isEmpty(dictName)) {  
                                dict.setName(dictName);  
                                // 检查名称是否重复.   
                                if (map.containsKey(dictName)) {  
                                    toastShow("名称重复,请检查,保存失败!");  
                                    return;  
                                }  
                                map.put(dictName, dictName);  
                                if (!TextUtils.isEmpty(dictOrders)) {  
                                    dict.setOrders(Integer.parseInt(dictOrders));  
                                } else {  
                                    dict.setOrders(orders);  
                                }  
                                if (!TextUtils.isEmpty(dictId)) {  
                                    dict.setId(Integer.parseInt(dictId));  
                                    dictMap.put(dictId, dict);  
                                } else {  
                                    dict.setId(0);  
                                    dict.setTypes(1);  
                                    dictAddList.add(dict);  
                                }  
                            } else {  
                                toastShow("名称不能为空,保存失败!");  
                                return;  
                            }  
      
                        }  
                        if (dao == null) {  
                            dao = new DictDaoImpl(MainActivity.this);  
                        }  
                        // 在数据库中取出Dict对象   
                        List<Dict> list = new ArrayList<Dict>();  
                        if (entity_id != 0) {  
                            list = dao.getDictItem(String.valueOf(entity_id));  
                        }  
                        // 比较数据库中取出的对象和界面上构造的对象,找出那些需要修改那些需要删除那些需要添加   
                        for (Dict dict : list) {  
                            String dict_id = String.valueOf(dict.getId());  
                            if (dictMap.containsKey(dict_id)) {  
                                Dict temp = dictMap.get(dict_id);  
                                if (!dict.getName().equals(temp.getName())  
                                        || dict.getOrders() != temp.getOrders()) {  
                                    dict.setName(temp.getName());  
                                    dict.setOrders(temp.getOrders());  
                                    dictUpdateList.add(dict);  
                                }  
                            } else {  
                                dictDeleteList.add(dict);  
                            }  
                        }  
      
                        // 添加对象并建立关系   
                        for (Dict dict : dictAddList) {  
                            // 插入对象   
                            Long itemId = dao.insert(dict);  
                            // 建立关系...   
                            // ....   
                        }  
      
                        // 修改业务字典对象   
                        for (Dict dict : dictUpdateList) {  
                            dao.update(dict);  
                        }  
      
                        // 删除不存在的业务字典   
                        Integer[] ids = new Integer[dictDeleteList.size()];  
                        for (int j = 0; j < dictDeleteList.size(); j++) {  
                            Dict dict2 = dictDeleteList.get(j);  
                            ids[j] = dict2.getId();  
                        }  
                        dao.delete(ids);  
                        toastShow("修改[" + entityNameET + "]成功!");  
                    }  
      
                    // setResult(1);   
                    // MainActivity.this.finish();   
                    break;  
                case R.id.btnReset:  
                    // 若为添加则重置为空,若为修改则重置为打开前的数据.   
                    nameET.setText(entity_name);  
                    initDictItemTable();  
                    toastShow("重置成功,请重新输入");  
                    // setResult(CrmConstances.RESULT_FAILURE);   
                    break;  
                case R.id.btnCancel:  
                    // setResult(CrmConstances.RESULT_FAILURE);   
                    MainActivity.this.finish(); // 结束自己,即回到打开之前的Activity.   
                    toastShow("关闭");  
                    break;  
                default:  
                    break;  
                }  
      
            }  
        };  
      
        public void toastShow(String text) {  
            Toast.makeText(this, text, 1000).show();  
        }  
      
        private void appendNewRow(final TableLayout table) {  
            TableRow row = new TableRow(this);  
            row.setId(0);  
            orders++;  
      
            TextView dictItemId = new TextView(this);  
            dictItemId.setText("");  
            dictItemId.setVisibility(View.GONE);  
      
            EditText order = new EditText(this);  
            order.setText(String.valueOf(orders));  
            order.setPadding(3, 3, 3, 3);  
            order.setWidth(40);  
            order.setGravity(Gravity.CENTER);  
      
            EditText dictName = new EditText(this);  
            dictName.setText("");  
            dictName.setHint("请输入业务字典名称");  
            dictName.setPadding(3, 3, 3, 3);  
            dictName.setWidth(190);  
            dictName.setGravity(Gravity.CENTER);  
      
            Button oper = new Button(this);  
            oper.setText(" 删除 ");  
            oper.setPadding(3, 3, 3, 3);  
            order.setWidth(60);  
            oper.setGravity(Gravity.CENTER);  
            oper.setOnClickListener(new OnClickListener() {  
                @Override  
                public void onClick(View v) {  
                    table.removeView(table.findViewById(0));  
                }  
            });  
      
            row.addView(dictItemId);  
            row.addView(order);  
            row.addView(dictName);  
            row.addView(oper);  
      
            table.addView(row);  
      
            // LinearLayout linear = (LinearLayout) findViewById(R.id.dictLayout);   
            // ViewGroup.LayoutParams params = (ViewGroup.LayoutParams) linear   
            // .getLayoutParams();   
            // params.height = LayoutParams.WRAP_CONTENT;   
            // params.width = LayoutParams.FILL_PARENT;   
            // linear.setLayoutParams(params);   
        }  
      
        public void initDictItemTable() {  
            if (dao == null) {  
                dao = new DictDaoImpl(this);  
            }  
            List<Dict> list = new ArrayList<Dict>();  
            if (entity_id != 0) {  
                list = dao.getDictItem(String.valueOf(entity_id));  
            }  
            table.removeAllViews();  
            TableRow row1 = new TableRow(this);  
            TextView dictItemId1 = new TextView(this);  
            dictItemId1.setText("");  
            dictItemId1.setVisibility(View.GONE);  
      
            TextView order1 = new TextView(this);  
            order1.setText(" 序号 ");  
            order1.setPadding(3, 3, 3, 3);  
            order1.setWidth(40);  
            order1.setGravity(Gravity.CENTER);  
      
            TextView dictName1 = new TextView(this);  
            dictName1.setText("字典名称");  
            dictName1.setPadding(3, 3, 3, 3);  
            dictName1.setWidth(190);  
            dictName1.setGravity(Gravity.CENTER);  
      
            TextView oper1 = new TextView(this);  
            oper1.setText(" 操作 ");  
            oper1.setPadding(3, 3, 3, 3);  
            oper1.setWidth(60);  
            oper1.setGravity(Gravity.CENTER);  
      
            row1.addView(dictItemId1);  
            row1.addView(order1);  
            row1.addView(dictName1);  
            row1.addView(oper1);  
            table.addView(row1);  
            orders = 0;  
            for (Dict dict : list) {  
                orders = Math.max(dict.getOrders(), orders);// 取较大的作为新orders.   
                TableRow row = new TableRow(this);  
                row.setId(dict.getId());  
                TextView dictItemId = new TextView(this);  
                dictItemId.setText(String.valueOf(dict.getId()));  
                dictItemId.setVisibility(View.GONE);  
      
                EditText order = new EditText(this);  
                order.setText(String.valueOf(dict.getOrders()));  
                order.setPadding(3, 3, 3, 3);  
                order.setWidth(40);  
                order.setGravity(Gravity.CENTER);  
      
                EditText dictName = new EditText(this);  
                dictName.setText(dict.getName());  
                dictName.setPadding(3, 3, 3, 3);  
                dictName.setWidth(190);  
                dictName.setGravity(Gravity.CENTER);  
      
                Button oper = new Button(this);  
                oper.setId(dict.getId() + 1000); // 设置这个Id,用于计算得到TableRow的Id.   
                oper.setText(" 删除 ");  
                oper.setPadding(3, 3, 3, 3);  
                oper.setWidth(60);  
                oper.setGravity(Gravity.CENTER);  
                oper.setOnClickListener(new OnClickListener() {  
                    @Override  
                    public void onClick(View v) {  
                        System.out.println(v.getId());  
                        table.removeView(table.findViewById(v.getId() - 1000));  
                    }  
                });  
      
                row.addView(dictItemId);  
                row.addView(order);  
                row.addView(dictName);  
                row.addView(oper);  
      
                table.addView(row, new TableLayout.LayoutParams());  
            }  
            // LinearLayout linear = (LinearLayout) findViewById(R.id.dictLayout);   
            // ViewGroup.LayoutParams params = (ViewGroup.LayoutParams) linear   
            // .getLayoutParams();   
            // params.height = LayoutParams.WRAP_CONTENT;   
            // params.width = LayoutParams.FILL_PARENT;   
            // linear.setLayoutParams(params);   
        }  
      
    }


 

你可能感兴趣的:(Android使用TableLayou动态布局实例)