以前學習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) {
}
};
}
運行結果:
當我選擇部門爲:財務部時:
工作職位出現的爲: