这篇博客是纯技术性的,认真看完代码您一定会有收获哦!!!
有图有真相,请先看效果截图:
实现主要功能:
* 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 + "]";
- }
- }<span style="font-size:18px;">
- </span>
- 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) {
- }
- }<span style="font-size:18px;">
- </span>
然后,建立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);
- }
- }