我在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
}
});
现在我的问题在于:
这里我需要在从状态Spinner获取值后创建zoneList。
本网站早些时候提到的类似问题,他们做了什么: 他们已经为两个微调器创建了两个适配器,然后应用setOnItemSelectedListener。 请帮助我,因为在这里,我的思绪完全停止了。 我提到了很多书和网站,但他们甚至没有提到这类问题。
答案 0 :(得分:3)
我在这里看到了几个解决方案:
不是将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文档以了解如何执行此操作。
为什么你甚至需要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中。只需要一个获取相关区域名的方法就可以在你的帮助器类中了。