Android TableLayout固定标题 android tablelayout动态添加_android

实现主要功能:
 * 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>