Android使用TableLayou动态布局实例
实现主要功能:
* 1.使用TableLayout动态布局展示,可动态添加和删除.
* 2.初始化时显示动态展示,初始化的数据改造后可来自数据库.
* 3.重置时到初始化状态.
* 4.保存时去重检查,参见代码中去重算法.
首先,建立实体类:
- packagetgb.lk.tablelayout;
- publicclassDict{
- privateintid;
- privateStringname;
- privateintorders;
- privateStringdesc;
- privateinttypes;
- //get,set方法.
- @Override
- publicStringtoString(){
- return"Dict[id="+id+",name="+name+",orders="+orders
- +",types="+types+"]";
- }
- }
其次,建立数据层方法接口:
- packagetgb.lk.tablelayout;
- importjava.util.ArrayList;
- importjava.util.List;
- importandroid.content.Context;
- publicclassDictDaoImpl{
- publicDictDaoImpl(Contextcontext){
- }
- publicbooleanisExist(){
- returnfalse;
- }
- publicList<Dict>getDictItem(StringdictId){
- String[]dicts=newString[]{"华东","华南","华北","华中","西南","东北"};
- List<Dict>retList=newArrayList<Dict>();
- for(intj=0;j<dicts.length;j++){
- Dictdict=newDict();
- dict.setName(dicts[j]);
- dict.setId(j);
- dict.setOrders(j);
- dict.setTypes(1000);
- retList.add(dict);
- }
- returnretList;
- }
- publiclonginsert(Dictentity){
- return1L;
- }
- publicvoiddelete(intid){
- }
- publicvoidupdate(Dictentity){
- }
- publicDictget(Objectid){
- Dictdict=newDict();
- dict.setId(1);
- dict.setName("华东");
- dict.setOrders(1);
- dict.setTypes(1000);
- returndict;
- }
- publicvoiddelete(Integer...ids){
- }
- }
- <?xmlversion="1.0"encoding="utf-8"?>
- <ScrollViewxmlns: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>
最后,建立逻辑主类:
- packagetgb.lk.tablelayout;
- importjava.util.ArrayList;
- importjava.util.HashMap;
- importjava.util.List;
- importjava.util.Map;
- importandroid.app.Activity;
- importandroid.content.Intent;
- importandroid.os.Bundle;
- importandroid.text.TextUtils;
- importandroid.view.Gravity;
- importandroid.view.View;
- importandroid.view.View.OnClickListener;
- importandroid.widget.Button;
- importandroid.widget.EditText;
- importandroid.widget.TableLayout;
- importandroid.widget.TableRow;
- importandroid.widget.TextView;
- importandroid.widget.Toast;
- /**
- *实现功能:
- *1.使用TableLayout动态布局展示,可动态添加和删除.
- *2.初始化时显示动态展示,初始化的数据改造后可来自数据库.
- *3.重置时到初始化状态.
- *4.保存时去重检查,参见代码中去重算法.
- *
- *@authorlikundate:2012-04-07
- */
- publicclassMainActivityextendsActivity{
- privateButtonbtnAdd=null;
- privateButtonbtnOK=null;
- privateButtonbtnReset=null;
- privateButtonbtnCancel=null;
- privateEditTextnameET=null;
- privateintentity_id=0;
- privateStringentity_name="";
- privateDictDaoImpldao=null;
- privateTableLayouttable=null;
- privateintorders=0;//用户记录最大的orders值
- @Override
- protectedvoidonCreate(BundlesavedInstanceState){
- 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);
- //Intentintent=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();
- }
- OnClickListenerlistener=newOnClickListener(){
- @Override
- publicvoidonClick(Viewv){
- switch(v.getId()){
- caseR.id.btnAdd:
- appendNewRow(table);
- break;
- caseR.id.btnOK:
- //组名称不能为空.
- if(TextUtils.isEmpty(nameET.getText().toString().trim())){
- toastShow("名称不能为空,操作失败!");
- nameET.requestFocus();//设定焦点
- break;
- }
- if(dao==null){
- dao=newDictDaoImpl(MainActivity.this);
- }
- StringentityNameET=nameET.getText().toString().trim();
- if(entity_id!=0){
- Dictentity=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=newHashMap<String,Dict>();
- List<Dict>dictAddList=newArrayList<Dict>();
- List<Dict>dictUpdateList=newArrayList<Dict>();
- List<Dict>dictDeleteList=newArrayList<Dict>();
- Map<String,String>map=newHashMap<String,String>();
- //从界面得到业务字典对象
- for(inti=1;i<table.getChildCount();i++){
- //得到TableRow对象
- TableRowrow=(TableRow)table.getChildAt(i);
- StringdictId=((TextView)row.getChildAt(0))
- .getText().toString();
- StringdictOrders=((EditText)row.getChildAt(1))
- .getText().toString();
- StringdictName=((EditText)row.getChildAt(2))
- .getText().toString();
- //构建Dict对象
- Dictdict=newDict();
- 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=newDictDaoImpl(MainActivity.this);
- }
- //在数据库中取出Dict对象
- List<Dict>list=newArrayList<Dict>();
- if(entity_id!=0){
- list=dao.getDictItem(String.valueOf(entity_id));
- }
- //比较数据库中取出的对象和界面上构造的对象,找出那些需要修改那些需要删除那些需要添加
- for(Dictdict:list){
- Stringdict_id=String.valueOf(dict.getId());
- if(dictMap.containsKey(dict_id)){
- Dicttemp=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(Dictdict:dictAddList){
- //插入对象
- LongitemId=dao.insert(dict);
- //建立关系...
- //....
- }
- //修改业务字典对象
- for(Dictdict:dictUpdateList){
- dao.update(dict);
- }
- //删除不存在的业务字典
- Integer[]ids=newInteger[dictDeleteList.size()];
- for(intj=0;j<dictDeleteList.size();j++){
- Dictdict2=dictDeleteList.get(j);
- ids[j]=dict2.getId();
- }
- dao.delete(ids);
- toastShow("修改["+entityNameET+"]成功!");
- }
- //setResult(1);
- //MainActivity.this.finish();
- break;
- caseR.id.btnReset:
- //若为添加则重置为空,若为修改则重置为打开前的数据.
- nameET.setText(entity_name);
- initDictItemTable();
- toastShow("重置成功,请重新输入");
- //setResult(CrmConstances.RESULT_FAILURE);
- break;
- caseR.id.btnCancel:
- //setResult(CrmConstances.RESULT_FAILURE);
- MainActivity.this.finish();//结束自己,即回到打开之前的Activity.
- toastShow("关闭");
- break;
- default:
- break;
- }
- }
- };
- publicvoidtoastShow(Stringtext){
- Toast.makeText(this,text,1000).show();
- }
- privatevoidappendNewRow(finalTableLayouttable){
- TableRowrow=newTableRow(this);
- row.setId(0);
- orders++;
- TextViewdictItemId=newTextView(this);
- dictItemId.setText("");
- dictItemId.setVisibility(View.GONE);
- EditTextorder=newEditText(this);
- order.setText(String.valueOf(orders));
- order.setPadding(3,3,3,3);
- order.setWidth(40);
- order.setGravity(Gravity.CENTER);
- EditTextdictName=newEditText(this);
- dictName.setText("");
- dictName.setHint("请输入业务字典名称");
- dictName.setPadding(3,3,3,3);
- dictName.setWidth(190);
- dictName.setGravity(Gravity.CENTER);
- Buttonoper=newButton(this);
- oper.setText("删除");
- oper.setPadding(3,3,3,3);
- order.setWidth(60);
- oper.setGravity(Gravity.CENTER);
- oper.setOnClickListener(newOnClickListener(){
- @Override
- publicvoidonClick(Viewv){
- table.removeView(table.findViewById(0));
- }
- });
- row.addView(dictItemId);
- row.addView(order);
- row.addView(dictName);
- row.addView(oper);
- table.addView(row);
- //LinearLayoutlinear=(LinearLayout)findViewById(R.id.dictLayout);
- //ViewGroup.LayoutParamsparams=(ViewGroup.LayoutParams)linear
- //.getLayoutParams();
- //params.height=LayoutParams.WRAP_CONTENT;
- //params.width=LayoutParams.FILL_PARENT;
- //linear.setLayoutParams(params);
- }
- publicvoidinitDictItemTable(){
- if(dao==null){
- dao=newDictDaoImpl(this);
- }
- List<Dict>list=newArrayList<Dict>();
- if(entity_id!=0){
- list=dao.getDictItem(String.valueOf(entity_id));
- }
- table.removeAllViews();
- TableRowrow1=newTableRow(this);
- TextViewdictItemId1=newTextView(this);
- dictItemId1.setText("");
- dictItemId1.setVisibility(View.GONE);
- TextVieworder1=newTextView(this);
- order1.setText("序号");
- order1.setPadding(3,3,3,3);
- order1.setWidth(40);
- order1.setGravity(Gravity.CENTER);
- TextViewdictName1=newTextView(this);
- dictName1.setText("字典名称");
- dictName1.setPadding(3,3,3,3);
- dictName1.setWidth(190);
- dictName1.setGravity(Gravity.CENTER);
- TextViewoper1=newTextView(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(Dictdict:list){
- orders=Math.max(dict.getOrders(),orders);//取较大的作为新orders.
- TableRowrow=newTableRow(this);
- row.setId(dict.getId());
- TextViewdictItemId=newTextView(this);
- dictItemId.setText(String.valueOf(dict.getId()));
- dictItemId.setVisibility(View.GONE);
- EditTextorder=newEditText(this);
- order.setText(String.valueOf(dict.getOrders()));
- order.setPadding(3,3,3,3);
- order.setWidth(40);
- order.setGravity(Gravity.CENTER);
- EditTextdictName=newEditText(this);
- dictName.setText(dict.getName());
- dictName.setPadding(3,3,3,3);
- dictName.setWidth(190);
- dictName.setGravity(Gravity.CENTER);
- Buttonoper=newButton(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(newOnClickListener(){
- @Override
- publicvoidonClick(Viewv){
- 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,newTableLayout.LayoutParams());
- }
- //LinearLayoutlinear=(LinearLayout)findViewById(R.id.dictLayout);
- //ViewGroup.LayoutParamsparams=(ViewGroup.LayoutParams)linear
- //.getLayoutParams();
- //params.height=LayoutParams.WRAP_CONTENT;
- //params.width=LayoutParams.FILL_PARENT;
- //linear.setLayoutParams(params);
- }
- }