Android:一个微调器的值取决于其他微调器的值

时间:2011-12-30 11:51:03

标签: android database spinner adapter

我在Android Spinner上遇到了问题。在我的应用程序中,我在主布局上创建了两个Spinner。 '州'旋转器和'区'旋转器。 Spinner上的所有数据都存储在SQLite数据库中。我希望根据第一个微调器中特定“状态”的选择,在第二个微调器上显示“区域”列表。 示例:假设当我在第一个微调器中选择Karnataka时,应用程序首先从与karnataka状态相关的SQLite数据库中检索所有区域,然后在第二个Spinner上显示。

为此,我正确地执行所有数据库活动意味着创建两个表'state'和'district',其中分区表中的一列是外键,它被称为'state table'的主键之一

db.execSQL("create table "+STATE_TABLE+" ("+
            STATE_ID+" integer primary key autoincrement not null, "+
                STATE_NAME+" text"+")");

    db.execSQL("create table "+DISTRICT_TABLE+" ("+DISTRICT_ID+
            " integer primary key autoincrement not null,"+DISTRICT_NAME
                +" text,"+STATE_ID+" integer, FOREIGN KEY("
                    +STATE_ID+") REFERENCES "+STATE_TABLE
                        +"("+STATE_ID+")"+")");

现在在活动类中:

spinnerState = (Spinner)findViewById(R.id.spinner1);
spinnerDistrict = (Spinner)findViewById(R.id.spinner2);
stateList = new ArrayList<String>();
districtList = new ArrayList<String>();

假设所有数据都准备好存储在数据库中。

现在我需要从数据库中检索所有“State”数据并将其添加到ArrayList的状态列表中。

Cursor stateCursor = database.query(STATE_TABLE, new String[]{STATE_ID, STATE_NAME},
            null, null, null, null, STATE_NAME);
    stateCursor.moveToFirst();

    if(! stateCursor.isAfterLast()){
        do{
            int id = stateCursor.getInt(0);
            String stateName = stateCursor.getString(1);
            stateList.add(stateName);
        }while(stateCursor.moveToNext());
    }
    stateCursor.close();

之后我创建了一个ArrayAdapter并将此状态列表放入其中。

spinnerState.setAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, stateList));

接下来,我将以下代码放在活动类中:

spinnerState.setOnItemSelectedListener(new OnItemSelectedListener() {
        @Override
        public void onItemSelected(AdapterView<?> parent, View v,
                int pos, long id) {

        }

        @Override
        public void onNothingSelected(AdapterView<?> arg0) {
            // TODO Auto-generated method stub
        }
    });

现在我的问题在于:

  1. 如何获取StateId以执行select查询以获取与数据库中特定状态相关的所有区域。
  2. 适配器将如何为区域生成。
  3. 我放了所有这些代码。
  4. 这里我需要在从状态Spinner获取值后创建zoneList。

    本网站早些时候提到的类似问题,他们做了什么: 他们已经为两个微调器创建了两个适配器,然后应用setOnItemSelectedListener。 请帮助我,因为在这里,我的思绪完全停止了。 我提到了很多书和网站,但他们甚至没有提到这类问题。

2 个答案:

答案 0 :(得分:3)

我在这里看到了几个解决方案:

选项1:

不是将stateList声明为ArrayList<String>,而是创建自定义POJO StateInfo并将州列表指定为ArrayList<StateInfo>

public class StateList {
    private int id;
    private String stateName;

    //Constructors, getters and setters
}

然后,

if(! stateCursor.isAfterLast()){
    do{
        int id = stateCursor.getInt(0);
        String stateName = stateCursor.getString(1);
        stateList.add(new StateInfo(id, stateName));
    }while(stateCursor.moveToNext());
}

现在,你可以这样做:

public void onItemSelected(AdapterView<?> parent, View v,
        int pos, long id) {
    int id = stateList.get(pos).getId();
    //Use This ID to construct your next SQLite query; and populate the district spinner.
}

如果您这样做,则必须创建自定义ArrayAdapter并实施getView()方法。请查看Android文档以了解如何执行此操作。

选项2:

为什么你甚至需要stateID?我想你可以写一个查询来获得只有状态名称的区域列表。在这种情况下,您可以将stateList保留为ArrayList<String>,甚至根本不需要StateInfo课程。就这样做:

public void onItemSelected(AdapterView<?> parent, View v,
        int pos, long id) {
    String stateName = stateList.get(pos);
    //Use this name to construct your next SQLite query; and populate the district spinner.
}

答案 1 :(得分:1)

问题1:

你只需要跟踪哪个州用户选择进入微调器,并根据其位置,你必须找到它的相关id。然后你可以相应地查询区。显然你必须使用该微调器的onItemSelectedListener来获得所选州的位置。

问题2:

你需要在helper类中创建一个方法,它接受stateId(你可以像我上面说的那样计算)并根据String数组中的区域名返回你。所以在你的主要活动中,在状态微调器的onItemSelectedListener中,你将不得不抓住该字符串数组并为其准备适配器。在那里,您必须将适配器设置为您的区域微调器。

这将始终为您的区域微分器更新用户在状态数组中选择的内容。

问题3:

几乎所有代码都只在你的状态微调器的onItemSelectedListener中。只需要一个获取相关区域名的方法就可以在你的帮助器类中了。