Android使用TableLayout动态布局实例

这篇博客是纯技术性的,认真看完代码您一定会有收获哦!!!

有图有真相,请先看效果截图:


实现主要功能:

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

首先,建立实体类:

  1. package tgb.lk.tablelayout;  
  2.   
  3. public class Dict {  
  4.   
  5.     private int id;  
  6.     private String name;  
  7.     private int orders;  
  8.     private String desc;  
  9.     private int types;  
  10.       
  11.     //get,set方法.  
  12.   
  13.     @Override  
  14.     public String toString() {  
  15.         return "Dict [id=" + id + ", name=" + name + ", orders=" + orders  
  16.                 + ", types=" + types + "]";  
  17.     }  
  18.   
  19. }<span style="font-size:18px;">  
  20. </span>  


其次,建立数据层方法接口:
  1. package tgb.lk.tablelayout;  
  2.   
  3. import java.util.ArrayList;  
  4. import java.util.List;  
  5.   
  6. import android.content.Context;  
  7.   
  8. public class DictDaoImpl {  
  9.   
  10.     public DictDaoImpl(Context context) {  
  11.   
  12.     }  
  13.   
  14.     public boolean isExist() {  
  15.         return false;  
  16.     }  
  17.   
  18.     public List<Dict> getDictItem(String dictId) {  
  19.         String[] dicts = new String[] { "华东""华南""华北""华中""西南""东北" };  
  20.         List<Dict> retList = new ArrayList<Dict>();  
  21.         for (int j = 0; j < dicts.length; j++) {  
  22.             Dict dict = new Dict();  
  23.             dict.setName(dicts[j]);  
  24.             dict.setId(j);  
  25.             dict.setOrders(j);  
  26.             dict.setTypes(1000);  
  27.             retList.add(dict);  
  28.         }  
  29.         return retList;  
  30.     }  
  31.   
  32.     public long insert(Dict entity) {  
  33.         return 1L;  
  34.     }  
  35.   
  36.     public void delete(int id) {  
  37.     }  
  38.   
  39.     public void update(Dict entity) {  
  40.     }  
  41.   
  42.     public Dict get(Object id) {  
  43.         Dict dict = new Dict();  
  44.         dict.setId(1);  
  45.         dict.setName("华东");  
  46.         dict.setOrders(1);  
  47.         dict.setTypes(1000);  
  48.         return dict;  
  49.     }  
  50.   
  51.     public void delete(Integer... ids) {  
  52.     }  
  53. }<span style="font-size:18px;">  
  54. </span>  

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

  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <ScrollView xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:layout_width="fill_parent"  
  4.     android:layout_height="wrap_content"  
  5.     android:scrollbars="none" >  
  6.   
  7.     <LinearLayout  
  8.         android:id="@+id/dictLayout"  
  9.         android:layout_width="fill_parent"  
  10.         android:layout_height="fill_parent"  
  11.         android:orientation="vertical"  
  12.         android:scrollbars="" >  
  13.   
  14.         <TextView  
  15.             android:id="@+id/title"  
  16.             android:layout_width="fill_parent"  
  17.             android:layout_height="wrap_content"  
  18.             android:text="业务字典管理" />  
  19.   
  20.         <LinearLayout  
  21.             android:layout_width="fill_parent"  
  22.             android:layout_height="wrap_content"  
  23.             android:orientation="horizontal" >  
  24.   
  25.             <TextView  
  26.                 android:layout_width="80dp"  
  27.                 android:layout_height="wrap_content"  
  28.                 android:text="名称:" />  
  29.   
  30.             <EditText  
  31.                 android:id="@+id/name"  
  32.                 android:layout_width="200dp"  
  33.                 android:layout_height="wrap_content"  
  34.                 android:hint="请输入业务字典名称"  
  35.                 android:maxLength="20"  
  36.                 android:singleLine="true" />  
  37.         </LinearLayout>  
  38.   
  39.         <TableLayout  
  40.             android:id="@+id/dictTable"  
  41.             android:layout_width="fill_parent"  
  42.             android:layout_height="wrap_content"  
  43.             android:stretchColumns="1" >  
  44.   
  45.             <TableRow >  
  46.   
  47.                 <TextView  
  48.                     android:layout_width="60dp"  
  49.                     android:layout_gravity="left"  
  50.                     android:padding="3dip"  
  51.                     android:text="序号"  
  52.                     android:textStyle="bold" />  
  53.   
  54.                 <TextView  
  55.                     android:layout_gravity="center"  
  56.                     android:padding="3dip"  
  57.                     android:text="字典名称"  
  58.                     android:textStyle="bold" />  
  59.   
  60.                 <TextView  
  61.                     android:layout_gravity="right"  
  62.                     android:padding="3dip"  
  63.                     android:text=" 操作 "  
  64.                     android:textStyle="bold" />  
  65.             </TableRow>  
  66.         </TableLayout>  
  67.   
  68.         <LinearLayout  
  69.             android:layout_width="fill_parent"  
  70.             android:layout_height="wrap_content"  
  71.             android:gravity="right"  
  72.             android:orientation="horizontal" >  
  73.   
  74.             <Button  
  75.                 android:id="@+id/btnCancel"  
  76.                 android:layout_width="wrap_content"  
  77.                 android:layout_height="wrap_content"  
  78.                 android:layout_margin="8dp"  
  79.                 android:text=" 关 闭 " />  
  80.   
  81.             <Button  
  82.                 android:id="@+id/btnReset"  
  83.                 android:layout_width="wrap_content"  
  84.                 android:layout_height="wrap_content"  
  85.                 android:layout_margin="8dp"  
  86.                 android:text=" 重 置 " />  
  87.   
  88.             <Button  
  89.                 android:id="@+id/btnAdd"  
  90.                 android:layout_width="wrap_content"  
  91.                 android:layout_height="wrap_content"  
  92.                 android:layout_margin="8dp"  
  93.                 android:text=" 添 加 " />  
  94.   
  95.             <Button  
  96.                 android:id="@+id/btnOK"  
  97.                 android:layout_width="wrap_content"  
  98.                 android:layout_height="wrap_content"  
  99.                 android:layout_margin="8dp"  
  100.                 android:text=" 保 存 " />  
  101.         </LinearLayout>  
  102.     </LinearLayout>  
  103.   
  104. </ScrollView>  


最后,建立逻辑主类:
  1. package tgb.lk.tablelayout;  
  2.   
  3. import java.util.ArrayList;  
  4. import java.util.HashMap;  
  5. import java.util.List;  
  6. import java.util.Map;  
  7.   
  8. import android.app.Activity;  
  9. import android.content.Intent;  
  10. import android.os.Bundle;  
  11. import android.text.TextUtils;  
  12. import android.view.Gravity;  
  13. import android.view.View;  
  14. import android.view.View.OnClickListener;  
  15. import android.widget.Button;  
  16. import android.widget.EditText;  
  17. import android.widget.TableLayout;  
  18. import android.widget.TableRow;  
  19. import android.widget.TextView;  
  20. import android.widget.Toast;  
  21.   
  22. /** 
  23.  * 实现功能:  
  24.  * 1.使用TableLayout动态布局展示,可动态添加和删除. 
  25.  * 2.初始化时显示动态展示,初始化的数据改造后可来自数据库.  
  26.  * 3.重置时到初始化状态. 
  27.  * 4.保存时去重检查,参见代码中去重算法. 
  28.  *  
  29.  * @author likun date: 2012-04-07 
  30.  */  
  31. public class MainActivity extends Activity {  
  32.     private Button btnAdd = null;  
  33.     private Button btnOK = null;  
  34.     private Button btnReset = null;  
  35.     private Button btnCancel = null;  
  36.   
  37.     private EditText nameET = null;  
  38.   
  39.     private int entity_id = 0;  
  40.     private String entity_name = "";  
  41.   
  42.     private DictDaoImpl dao = null;  
  43.     private TableLayout table = null;  
  44.     private int orders = 0// 用户记录最大的orders值  
  45.   
  46.     @Override  
  47.     protected void onCreate(Bundle savedInstanceState) {  
  48.         super.onCreate(savedInstanceState);  
  49.         setContentView(R.layout.dict_item);  
  50.   
  51.         // 实例化按钮并设置监听器.  
  52.         btnAdd = (Button) findViewById(R.id.btnAdd);  
  53.         btnOK = (Button) findViewById(R.id.btnOK);  
  54.         btnReset = (Button) findViewById(R.id.btnReset);  
  55.         btnCancel = (Button) findViewById(R.id.btnCancel);  
  56.   
  57.         btnAdd.setOnClickListener(listener);  
  58.         btnOK.setOnClickListener(listener);  
  59.         btnReset.setOnClickListener(listener);  
  60.         btnCancel.setOnClickListener(listener);  
  61.   
  62.         // 实例化EditText  
  63.         nameET = (EditText) findViewById(R.id.name);  
  64.   
  65.         // Intent intent = getIntent();  
  66.   
  67.         entity_id = 1// intent.getIntExtra(CrmConstances.ID, 0);  
  68.         entity_name = "区域";// intent.getStringExtra(CrmConstances.NAME);  
  69.   
  70.         nameET.setText(entity_name);  
  71.   
  72.         table = (TableLayout) findViewById(R.id.dictTable);  
  73.   
  74.         initDictItemTable();  
  75.     }  
  76.   
  77.     OnClickListener listener = new OnClickListener() {  
  78.   
  79.         @Override  
  80.         public void onClick(View v) {  
  81.   
  82.             switch (v.getId()) {  
  83.             case R.id.btnAdd:  
  84.                 appendNewRow(table);  
  85.                 break;  
  86.             case R.id.btnOK:  
  87.                 // 组名称不能为空.  
  88.                 if (TextUtils.isEmpty(nameET.getText().toString().trim())) {  
  89.                     toastShow("名称不能为空,操作失败!");  
  90.                     nameET.requestFocus(); // 设定焦点  
  91.                     break;  
  92.                 }  
  93.                 if (dao == null) {  
  94.                     dao = new DictDaoImpl(MainActivity.this);  
  95.                 }  
  96.   
  97.                 String entityNameET = nameET.getText().toString().trim();  
  98.   
  99.                 if (entity_id != 0) {  
  100.                     Dict entity = dao.get(entity_id);  
  101.                     // 组名发生改变时,判断组名称是否重复  
  102.                     if (!entity.getName().equals(entityNameET)) {  
  103.                         if (dao.isExist()) {  
  104.                             toastShow("名称[" + entityNameET + "]重复,操作失败!");  
  105.                             nameET.selectAll();  
  106.                             nameET.requestFocus();  
  107.                             break;  
  108.                         }  
  109.                         entity.setName(entityNameET);  
  110.                         dao.update(entity);  
  111.                     }  
  112.   
  113.                     Map<String, Dict> dictMap = new HashMap<String, Dict>();  
  114.                     List<Dict> dictAddList = new ArrayList<Dict>();  
  115.                     List<Dict> dictUpdateList = new ArrayList<Dict>();  
  116.                     List<Dict> dictDeleteList = new ArrayList<Dict>();  
  117.                     Map<String, String> map = new HashMap<String, String>();  
  118.                     // 从界面得到业务字典对象  
  119.                     for (int i = 1; i < table.getChildCount(); i++) {  
  120.                         // 得到TableRow对象  
  121.                         TableRow row = (TableRow) table.getChildAt(i);  
  122.                         String dictId = ((TextView) row.getChildAt(0))  
  123.                                 .getText().toString();  
  124.                         String dictOrders = ((EditText) row.getChildAt(1))  
  125.                                 .getText().toString();  
  126.                         String dictName = ((EditText) row.getChildAt(2))  
  127.                                 .getText().toString();  
  128.   
  129.                         // 构建Dict对象  
  130.                         Dict dict = new Dict();  
  131.                         if (!TextUtils.isEmpty(dictName)) {  
  132.                             dict.setName(dictName);  
  133.                             // 检查名称是否重复.  
  134.                             if (map.containsKey(dictName)) {  
  135.                                 toastShow("名称重复,请检查,保存失败!");  
  136.                                 return;  
  137.                             }  
  138.                             map.put(dictName, dictName);  
  139.                             if (!TextUtils.isEmpty(dictOrders)) {  
  140.                                 dict.setOrders(Integer.parseInt(dictOrders));  
  141.                             } else {  
  142.                                 dict.setOrders(orders);  
  143.                             }  
  144.                             if (!TextUtils.isEmpty(dictId)) {  
  145.                                 dict.setId(Integer.parseInt(dictId));  
  146.                                 dictMap.put(dictId, dict);  
  147.                             } else {  
  148.                                 dict.setId(0);  
  149.                                 dict.setTypes(1);  
  150.                                 dictAddList.add(dict);  
  151.                             }  
  152.                         } else {  
  153.                             toastShow("名称不能为空,保存失败!");  
  154.                             return;  
  155.                         }  
  156.   
  157.                     }  
  158.                     if (dao == null) {  
  159.                         dao = new DictDaoImpl(MainActivity.this);  
  160.                     }  
  161.                     // 在数据库中取出Dict对象  
  162.                     List<Dict> list = new ArrayList<Dict>();  
  163.                     if (entity_id != 0) {  
  164.                         list = dao.getDictItem(String.valueOf(entity_id));  
  165.                     }  
  166.                     // 比较数据库中取出的对象和界面上构造的对象,找出那些需要修改那些需要删除那些需要添加  
  167.                     for (Dict dict : list) {  
  168.                         String dict_id = String.valueOf(dict.getId());  
  169.                         if (dictMap.containsKey(dict_id)) {  
  170.                             Dict temp = dictMap.get(dict_id);  
  171.                             if (!dict.getName().equals(temp.getName())  
  172.                                     || dict.getOrders() != temp.getOrders()) {  
  173.                                 dict.setName(temp.getName());  
  174.                                 dict.setOrders(temp.getOrders());  
  175.                                 dictUpdateList.add(dict);  
  176.                             }  
  177.                         } else {  
  178.                             dictDeleteList.add(dict);  
  179.                         }  
  180.                     }  
  181.   
  182.                     // 添加对象并建立关系  
  183.                     for (Dict dict : dictAddList) {  
  184.                         // 插入对象  
  185.                         Long itemId = dao.insert(dict);  
  186.                         // 建立关系...  
  187.                         // ....  
  188.                     }  
  189.   
  190.                     // 修改业务字典对象  
  191.                     for (Dict dict : dictUpdateList) {  
  192.                         dao.update(dict);  
  193.                     }  
  194.   
  195.                     // 删除不存在的业务字典  
  196.                     Integer[] ids = new Integer[dictDeleteList.size()];  
  197.                     for (int j = 0; j < dictDeleteList.size(); j++) {  
  198.                         Dict dict2 = dictDeleteList.get(j);  
  199.                         ids[j] = dict2.getId();  
  200.                     }  
  201.                     dao.delete(ids);  
  202.                     toastShow("修改[" + entityNameET + "]成功!");  
  203.                 }  
  204.   
  205.                 // setResult(1);  
  206.                 // MainActivity.this.finish();  
  207.                 break;  
  208.             case R.id.btnReset:  
  209.                 // 若为添加则重置为空,若为修改则重置为打开前的数据.  
  210.                 nameET.setText(entity_name);  
  211.                 initDictItemTable();  
  212.                 toastShow("重置成功,请重新输入");  
  213.                 // setResult(CrmConstances.RESULT_FAILURE);  
  214.                 break;  
  215.             case R.id.btnCancel:  
  216.                 // setResult(CrmConstances.RESULT_FAILURE);  
  217.                 MainActivity.this.finish(); // 结束自己,即回到打开之前的Activity.  
  218.                 toastShow("关闭");  
  219.                 break;  
  220.             default:  
  221.                 break;  
  222.             }  
  223.   
  224.         }  
  225.     };  
  226.   
  227.     public void toastShow(String text) {  
  228.         Toast.makeText(this, text, 1000).show();  
  229.     }  
  230.   
  231.     private void appendNewRow(final TableLayout table) {  
  232.         TableRow row = new TableRow(this);  
  233.         row.setId(0);  
  234.         orders++;  
  235.   
  236.         TextView dictItemId = new TextView(this);  
  237.         dictItemId.setText("");  
  238.         dictItemId.setVisibility(View.GONE);  
  239.   
  240.         EditText order = new EditText(this);  
  241.         order.setText(String.valueOf(orders));  
  242.         order.setPadding(3333);  
  243.         order.setWidth(40);  
  244.         order.setGravity(Gravity.CENTER);  
  245.   
  246.         EditText dictName = new EditText(this);  
  247.         dictName.setText("");  
  248.         dictName.setHint("请输入业务字典名称");  
  249.         dictName.setPadding(3333);  
  250.         dictName.setWidth(190);  
  251.         dictName.setGravity(Gravity.CENTER);  
  252.   
  253.         Button oper = new Button(this);  
  254.         oper.setText(" 删除 ");  
  255.         oper.setPadding(3333);  
  256.         order.setWidth(60);  
  257.         oper.setGravity(Gravity.CENTER);  
  258.         oper.setOnClickListener(new OnClickListener() {  
  259.             @Override  
  260.             public void onClick(View v) {  
  261.                 table.removeView(table.findViewById(0));  
  262.             }  
  263.         });  
  264.   
  265.         row.addView(dictItemId);  
  266.         row.addView(order);  
  267.         row.addView(dictName);  
  268.         row.addView(oper);  
  269.   
  270.         table.addView(row);  
  271.   
  272.         // LinearLayout linear = (LinearLayout) findViewById(R.id.dictLayout);  
  273.         // ViewGroup.LayoutParams params = (ViewGroup.LayoutParams) linear  
  274.         // .getLayoutParams();  
  275.         // params.height = LayoutParams.WRAP_CONTENT;  
  276.         // params.width = LayoutParams.FILL_PARENT;  
  277.         // linear.setLayoutParams(params);  
  278.     }  
  279.   
  280.     public void initDictItemTable() {  
  281.         if (dao == null) {  
  282.             dao = new DictDaoImpl(this);  
  283.         }  
  284.         List<Dict> list = new ArrayList<Dict>();  
  285.         if (entity_id != 0) {  
  286.             list = dao.getDictItem(String.valueOf(entity_id));  
  287.         }  
  288.         table.removeAllViews();  
  289.         TableRow row1 = new TableRow(this);  
  290.         TextView dictItemId1 = new TextView(this);  
  291.         dictItemId1.setText("");  
  292.         dictItemId1.setVisibility(View.GONE);  
  293.   
  294.         TextView order1 = new TextView(this);  
  295.         order1.setText(" 序号 ");  
  296.         order1.setPadding(3333);  
  297.         order1.setWidth(40);  
  298.         order1.setGravity(Gravity.CENTER);  
  299.   
  300.         TextView dictName1 = new TextView(this);  
  301.         dictName1.setText("字典名称");  
  302.         dictName1.setPadding(3333);  
  303.         dictName1.setWidth(190);  
  304.         dictName1.setGravity(Gravity.CENTER);  
  305.   
  306.         TextView oper1 = new TextView(this);  
  307.         oper1.setText(" 操作 ");  
  308.         oper1.setPadding(3333);  
  309.         oper1.setWidth(60);  
  310.         oper1.setGravity(Gravity.CENTER);  
  311.   
  312.         row1.addView(dictItemId1);  
  313.         row1.addView(order1);  
  314.         row1.addView(dictName1);  
  315.         row1.addView(oper1);  
  316.         table.addView(row1);  
  317.         orders = 0;  
  318.         for (Dict dict : list) {  
  319.             orders = Math.max(dict.getOrders(), orders);// 取较大的作为新orders.  
  320.             TableRow row = new TableRow(this);  
  321.             row.setId(dict.getId());  
  322.             TextView dictItemId = new TextView(this);  
  323.             dictItemId.setText(String.valueOf(dict.getId()));  
  324.             dictItemId.setVisibility(View.GONE);  
  325.   
  326.             EditText order = new EditText(this);  
  327.             order.setText(String.valueOf(dict.getOrders()));  
  328.             order.setPadding(3333);  
  329.             order.setWidth(40);  
  330.             order.setGravity(Gravity.CENTER);  
  331.   
  332.             EditText dictName = new EditText(this);  
  333.             dictName.setText(dict.getName());  
  334.             dictName.setPadding(3333);  
  335.             dictName.setWidth(190);  
  336.             dictName.setGravity(Gravity.CENTER);  
  337.   
  338.             Button oper = new Button(this);  
  339.             oper.setId(dict.getId() + 1000); // 设置这个Id,用于计算得到TableRow的Id.  
  340.             oper.setText(" 删除 ");  
  341.             oper.setPadding(3333);  
  342.             oper.setWidth(60);  
  343.             oper.setGravity(Gravity.CENTER);  
  344.             oper.setOnClickListener(new OnClickListener() {  
  345.                 @Override  
  346.                 public void onClick(View v) {  
  347.                     System.out.println(v.getId());  
  348.                     table.removeView(table.findViewById(v.getId() - 1000));  
  349.                 }  
  350.             });  
  351.   
  352.             row.addView(dictItemId);  
  353.             row.addView(order);  
  354.             row.addView(dictName);  
  355.             row.addView(oper);  
  356.   
  357.             table.addView(row, new TableLayout.LayoutParams());  
  358.         }  
  359.         // LinearLayout linear = (LinearLayout) findViewById(R.id.dictLayout);  
  360.         // ViewGroup.LayoutParams params = (ViewGroup.LayoutParams) linear  
  361.         // .getLayoutParams();  
  362.         // params.height = LayoutParams.WRAP_CONTENT;  
  363.         // params.width = LayoutParams.FILL_PARENT;  
  364.         // linear.setLayoutParams(params);  
  365.     }  
  366.   
  367. }  

转载请注明http://blog.csdn.net/lk_blog/article/details/7436380

代码下载http://download.csdn.net/detail/lk_blog/4207024

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值