Android使用TableLayout动态布局实例

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

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

Android使用TableLayout动态布局实例_第1张图片

实现主要功能:

 * 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 + "]";
	}

}


其次,建立数据层方法接口:
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) {
	}
}

然后,建立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);
	}

}

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

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



你可能感兴趣的:(android,android,实例,tablelayout,动态布局)