实现主要功能:
* 1.使用TableLayout动态布局展示,可动态添加和删除.
* 2.初始化时显示动态展示,初始化的数据改造后可来自数据库.
* 3.重置时到初始化状态.
* 4.保存时去重检查,参见代码中去重算法.
首先,建立实体类:
[java]
<span style="font-size:18px;">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>
其次,建立数据层方法接口:
[java]
<span style="font-size:18px;">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>
然后,建立layout布局dict_item.xml:
[html]
<span style="font-size:18px;"><?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></span>
最后,建立逻辑主类:
<span style="font-size:18px;">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); //这里的是中间显示的那个TableLayout的布局
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);
}
}</span>