从数据库表中提取唯一值插入临时表,并作为 Spinner 的数据源,使用标志变量防止初始化未完成时触发 spinner 的 onItemSelected 事件

spYear = (Spinner) findViewById(R.id.spYear);
// 删除临时表
db.execSQL("drop table if exists t;");
// 取得年份唯一值,并插入到临时表中(直接使用 select distinct 返回的结果集没有 _id 列,无法作为 Spinner 的数据源)
db.execSQL("create temporary table t as select distinct strftime('%Y', date) as year from zhangmu where pay < 0;");
// 表尾加入一个空字符串,在 Spinner 中用来显示所有记录
db.execSQL("insert into t (year) values ('');");
// 使用 rowid 作为 _id 列
Cursor cYear = db.rawQuery("select rowid as _id, year from t order by year;", null);

SimpleCursorAdapter adpYear = new SimpleCursorAdapter(this, android.R.layout.simple_spinner_dropdown_item,
        cYear, new String[]{"year"}, new int[]{android.R.id.text1}, 0);
spYear.setAdapter(adpYear);

private boolean bReady = false;
spYear.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
    @Override
    public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
    if (bReady) {
        Cursor cTmp = (Cursor) spYear.getSelectedItem();
        ShowPayout(cTmp.getString(cTmp.getColumnIndex("year")));
        // 马上关闭游标会引发异常
        //cTmp.close();
    } else {
        // activity 初始化时会默认选择第一项并触发 onItemSelected 事件
        // 使用标志变量 bReady 避免初始化未完成时触发 onItemSelected 事件而引发异常
        view.setVisibility(View.INVISIBLE);
        bReady = true;
    }
    }

    @Override
    public void onNothingSelected(AdapterView<?> parent) {
        //Log.i("infoo", "NOTHING");
    }
});
posted @ 2022-01-06 21:40  汉学  阅读(40)  评论(0)    收藏  举报