Android使用TableLayou動態布局實例

openkk 12年前發布 | 34K 次閱讀 Android Android開發 移動開發

實現主要功能:

 * 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);   
        }  

    }
Android使用TableLayou動態布局實例

 本文由用戶 openkk 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!