Android利用Spinner從數據庫中讀取數據並實現2級互動

以前學習Java EE的時候,經常會遇到一些下拉表單進行聯動的實例。

例子:假如一個公司有三個部門,括號裏面是職位

人力資源部(員工關係主管,招聘主管 )

財務部(財務總監、財務部經理、審計主管)

生產技術部(程序員,設計師,架構師)


我們將做個兩級聯動的spinner,當我第一級選擇不同的部門,第二級將顯示不同的職位


SQLiteOpenHelper類:

package org.jian.database;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

public class DBHelper extends SQLiteOpenHelper {
    private static final String DB_NAME = "martin.db" ;
    private static final int VERSION = 3 ;
    
    SQLiteDatabase db ;
    private String job_sql = "CREATE TABLE IF NOT EXISTS job(" +
                             "_id INTEGER PRIMARY KEY ," +
                             "jobname VARCHAR(20) ," +
                             "did INTEGER" +
                             ")" ;
    private String dept_sql = "CREATE TABLE IF NOT EXISTS dept(" +
                              "_id INTEGER PRIMARY KEY ," +
                              "deptname VARCHAR(20)" +
                              ")" ;
    
    public DBHelper(Context context) {
        super(context, DB_NAME, null, VERSION);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        this.db = db ;
        db.execSQL(job_sql) ;
        db.execSQL(dept_sql) ;
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        
    }

}




用sql插入數據(在sqlite裏,用adb進入):

INSERT INTO job VALUES(null ,"員工關係主管" , 1) ;
INSERT INTO job VALUES(null ,"招聘主管 " , 1) ;
INSERT INTO job VALUES(null ,"財務總監" , 2) ;
INSERT INTO job VALUES(null ,"財務部經理" , 2) ;
INSERT INTO job VALUES(null ,"審計主管" , 2) ;
INSERT INTO job VALUES(null ,"程序員" , 3) ;
INSERT INTO job VALUES(null ,"設計師" , 3) ;
INSERT INTO job VALUES(null ,"架構師" , 3) ;

INSERT INTO dept VALUES(null ,"人力資源部" ) ;
INSERT INTO dept VALUES(null ,"財務部" ) ;
INSERT INTO dept VALUES(null ,"生產技術部" ) ;

處理數據的類:

package org.jian.service;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.jian.database.DBHelper;

import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;

public class Database {
    private DBHelper dbHelper;

    public Database(Context context) {
        dbHelper = new DBHelper(context);
    }

    /**
     * 查詢數據庫,返回一個Map 這個Map包括 1,spinner需要顯示的字符串,以及其所組成的map 2,spinner需要顯示的字符串
     * 
     * @return
     */
    public Map<Integer, List<?>> getDepts() {
        String sql = "SELECT _id, deptname FROM dept";   //獲取部門Id號與部門的名稱
        SQLiteDatabase db = null;
        Cursor c = null;
        Map<Integer, List<?>> DeptData = new HashMap<Integer, List<?>>();
        try {
            db = dbHelper.getWritableDatabase(); // 獲取數據庫
            c = db.rawQuery(sql, null);
            List<Map<String, Integer>> collegeList1 = new ArrayList<Map<String, Integer>>();
            List<String> collegeList2 = new ArrayList<String>();
            while (c.moveToNext()) {
                Map<String, Integer> provinceMap = new HashMap<String, Integer>(); // 這個HashMap主要是用來白村學院的信息以及他的id
                String name = new String(c.getBlob(1), "GBK");
                provinceMap.put(name, c.getInt(0));
                collegeList1.add(provinceMap); // 保存這個Map
                collegeList2.add(name); // 保存這個名字的列表
            }
            DeptData.put(0, collegeList1);
            DeptData.put(1, collegeList2);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (c != null) {
                c.close();
            }
            if (db != null) {
                db.close();
            }
        }
        return DeptData;
    }

    /**
     * 返回一個List
     * 包含job的字符串所組成的數組
     * @param id
     * @return
     */
    public List<String> getJobById(int id) {
        String sql = "SELECT jobname FROM job WHERE did = " + id;
        SQLiteDatabase db = null;
        Cursor c = null;
        List<String> jobList = null;
        try {
            db = dbHelper.getWritableDatabase();
            c = db.rawQuery(sql, null);
            jobList = new ArrayList<String>();
            while (c.moveToNext()) {
                String jobName = new String(c.getBlob(0),"GBK") ;  //解決亂碼
                jobList.add(jobName);
            }
        } catch (Exception ex) {
            ex.printStackTrace();
        } finally {
            if (c != null) {
                c.close();
            }
            if (db != null) {
                db.close();
            }
        }
        return jobList;

    }
}



界面設計XML:spinner.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="請選擇你的部門" />

    <Spinner
        android:id="@+id/dept"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="請選擇你的職位" />

    <Spinner
        android:id="@+id/job"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

</LinearLayout>



Activity類:

package org.jian.activity;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import org.jian.service.Database;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemSelectedListener;
import android.widget.ArrayAdapter;
import android.widget.Spinner;

import com.example.spinner.R;

public class MainActivity extends Activity {
    List deptList = new ArrayList();

    List deptData = new ArrayList();

    List jobList = new ArrayList();
   
    Spinner job;
    Spinner dept;
    Database db;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.spanner);
        job = (Spinner) findViewById(R.id.job);
        dept = (Spinner) findViewById(R.id.dept);
        db = new Database(getApplicationContext());

        Map<Integer, List<?>> data = database.getDepts();// 得到數據庫數據

        deptList = data.get(1);
        deptData = data.get(0);

        ArrayAdapter deptAdapter = new ArrayAdapter(MainActivity.this,
                android.R.layout.simple_spinner_item, deptList);
        deptAdapter
                .setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); // 樣式

        dept.setAdapter(deptAdapter);

        dept.setOnItemSelectedListener(itemSelectedListener);
    }

    private OnItemSelectedListener itemSelectedListener = new OnItemSelectedListener() {
        @Override
        public void onItemSelected(AdapterView<?> parent, View view,
                int position, long id) {
            Spinner spdept = (Spinner) parent;
            String seldept = (String) spdept.getItemAtPosition(position);
            ArrayAdapter jobAdapter = null;
            Map<String, Integer> data = (Map<String, Integer>) deptData
                    .get(position);// 根據id,返回本門號的信息

            int pid = data.get(seldept);// 得到部門號的id
            List<String> jobList = db.getJobById(pid); // 根據id查得工作類型的一個List

            jobAdapter = new ArrayAdapter(MainActivity.this,
                    android.R.layout.simple_spinner_item, jobList);
            jobAdapter
                    .setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
            job.setAdapter(jobAdapter);
            job.setOnItemSelectedListener(jobSelectedListener);

        }

        @Override
        public void onNothingSelected(AdapterView<?> parent) {
        }
    };

    String selectedJob = null;
    private OnItemSelectedListener jobSelectedListener = new OnItemSelectedListener() {
        @Override
        public void onItemSelected(AdapterView<?> parent, View view,
                int position, long id) {
            Spinner spjob = (Spinner) parent;
            selectedJob = (String) spjob.getItemAtPosition(position);

        }

        @Override
        public void onNothingSelected(AdapterView<?> parent) {

        }
    };

}



運行結果:

當我選擇部門爲:財務部時:

工作職位出現的爲:



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章