`
bcyy
  • 浏览: 1825986 次
文章分类
社区版块
存档分类
最新评论

Android使用TableLayou动态布局实例

 
阅读更多

实现主要功能:

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


首先,建立实体类:

  1. packagetgb.lk.tablelayout;
  2. publicclassDict{
  3. privateintid;
  4. privateStringname;
  5. privateintorders;
  6. privateStringdesc;
  7. privateinttypes;
  8. //get,set方法.
  9. @Override
  10. publicStringtoString(){
  11. return"Dict[id="+id+",name="+name+",orders="+orders
  12. +",types="+types+"]";
  13. }
  14. }

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

  1. packagetgb.lk.tablelayout;
  2. importjava.util.ArrayList;
  3. importjava.util.List;
  4. importandroid.content.Context;
  5. publicclassDictDaoImpl{
  6. publicDictDaoImpl(Contextcontext){
  7. }
  8. publicbooleanisExist(){
  9. returnfalse;
  10. }
  11. publicList<Dict>getDictItem(StringdictId){
  12. String[]dicts=newString[]{"华东","华南","华北","华中","西南","东北"};
  13. List<Dict>retList=newArrayList<Dict>();
  14. for(intj=0;j<dicts.length;j++){
  15. Dictdict=newDict();
  16. dict.setName(dicts[j]);
  17. dict.setId(j);
  18. dict.setOrders(j);
  19. dict.setTypes(1000);
  20. retList.add(dict);
  21. }
  22. returnretList;
  23. }
  24. publiclonginsert(Dictentity){
  25. return1L;
  26. }
  27. publicvoiddelete(intid){
  28. }
  29. publicvoidupdate(Dictentity){
  30. }
  31. publicDictget(Objectid){
  32. Dictdict=newDict();
  33. dict.setId(1);
  34. dict.setName("华东");
  35. dict.setOrders(1);
  36. dict.setTypes(1000);
  37. returndict;
  38. }
  39. publicvoiddelete(Integer...ids){
  40. }
  41. }
然后,建立layout布局dict_item.xml:
  1. <?xmlversion="1.0"encoding="utf-8"?>
  2. <ScrollViewxmlns: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. <LinearLayout
  7. android:id="@+id/dictLayout"
  8. android:layout_width="fill_parent"
  9. android:layout_height="fill_parent"
  10. android:orientation="vertical"
  11. android:scrollbars="">
  12. <TextView
  13. android:id="@+id/title"
  14. android:layout_width="fill_parent"
  15. android:layout_height="wrap_content"
  16. android:text="业务字典管理"/>
  17. <LinearLayout
  18. android:layout_width="fill_parent"
  19. android:layout_height="wrap_content"
  20. android:orientation="horizontal">
  21. <TextView
  22. android:layout_width="80dp"
  23. android:layout_height="wrap_content"
  24. android:text="名称:"/>
  25. <EditText
  26. android:id="@+id/name"
  27. android:layout_width="200dp"
  28. android:layout_height="wrap_content"
  29. android:hint="请输入业务字典名称"
  30. android:maxLength="20"
  31. android:singleLine="true"/>
  32. </LinearLayout>
  33. <TableLayout
  34. android:id="@+id/dictTable"
  35. android:layout_width="fill_parent"
  36. android:layout_height="wrap_content"
  37. android:stretchColumns="1">
  38. <TableRow>
  39. <TextView
  40. android:layout_width="60dp"
  41. android:layout_gravity="left"
  42. android:padding="3dip"
  43. android:text="序号"
  44. android:textStyle="bold"/>
  45. <TextView
  46. android:layout_gravity="center"
  47. android:padding="3dip"
  48. android:text="字典名称"
  49. android:textStyle="bold"/>
  50. <TextView
  51. android:layout_gravity="right"
  52. android:padding="3dip"
  53. android:text="操作"
  54. android:textStyle="bold"/>
  55. </TableRow>
  56. </TableLayout>
  57. <LinearLayout
  58. android:layout_width="fill_parent"
  59. android:layout_height="wrap_content"
  60. android:gravity="right"
  61. android:orientation="horizontal">
  62. <Button
  63. android:id="@+id/btnCancel"
  64. android:layout_width="wrap_content"
  65. android:layout_height="wrap_content"
  66. android:layout_margin="8dp"
  67. android:text="关闭"/>
  68. <Button
  69. android:id="@+id/btnReset"
  70. android:layout_width="wrap_content"
  71. android:layout_height="wrap_content"
  72. android:layout_margin="8dp"
  73. android:text="重置"/>
  74. <Button
  75. android:id="@+id/btnAdd"
  76. android:layout_width="wrap_content"
  77. android:layout_height="wrap_content"
  78. android:layout_margin="8dp"
  79. android:text="添加"/>
  80. <Button
  81. android:id="@+id/btnOK"
  82. android:layout_width="wrap_content"
  83. android:layout_height="wrap_content"
  84. android:layout_margin="8dp"
  85. android:text="保存"/>
  86. </LinearLayout>
  87. </LinearLayout>
  88. </ScrollView>

最后,建立逻辑主类:

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

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics