次の問題があります: 2 つのスピナーがあります。1 つ目はカテゴリ 1、2 つ目はカテゴリ 2 です。
各スピナーは、テーブル cat1 および cat2 のデータベースからデータをロードできます。しかし、それはまさに私が望むものではありません。2 番目のスピナーが、cat1_id が現在選択されているスピナー 1 の cat_id と等しいデータをロードするようにします。
テーブルは次のようになります。
cat1:
| cat1_id | cat1_name |
=======================
| 1 | animal |
| 2 | plant |
| 3 | ... |
cat2:
| cat2_id | cat1_id | cat2_name |
=================================
| 1 | 1 | fish |
| 2 | 1 | mammal |
| 3 | 1 | bird |
| 4 | 2 | tree |
| 5 | ... | ... |
この比較を行う方法、またはスピナー 1 でどのアイテムが選択されているかを知る方法を教えてください。
私のコードは次のようなものです:
DatabaseHandler.class:
public List<String> getCat(){
labels = new ArrayList<String>();
db = this.getReadableDatabase();
cursor = db.rawQuery(SELECT_QUERY_CATEGORIE, null); // SELECT_QUERY_CATEGORIE = "SELECT * FROM cat1";
if (cursor.moveToFirst()) {
do {
labels.add(cursor.getString(1));
} while (cursor.moveToNext());
}
cursor.close();
db.close();
return labels;
}
public List<String> getSubcat(){
labels = new ArrayList<String>();
db = this.getReadableDatabase();
//cursor = db.rawQuery(SELECT_QUERY_SUBCATEGORIE, null); // SELECT_QUERY_SUBCATEGORIE = "SELECT * FROM cat2";
if (cursor.moveToFirst()) {
do {
labels.add(cursor.getString(2));
} while (cursor.moveToNext());
}
cursor.close();
db.close();
return labels;
}
MainActivity.class:
...
spCat.setOnItemSelectedListener(this);
spSubcat.setOnItemSelectedListener(this);
loadSpinnerData();
private void loadSpinnerData() {
List<String> lbCategorie = db.getCat();
ArrayAdapter<String> catAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, lbCategorie);
catAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spCat.setAdapter(catAdapter);
List<String> lbSubcategorie = db.getSubcat();
ArrayAdapter<String> subcatAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, lbSubcategorie);
subcatAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spSubcat.setAdapter(subcatAdapter);
}
public void onItemSelected(AdapterView<?> parent, View view, int position,
long id) {
}
@Override
public void onNothingSelected(AdapterView<?> arg0) {
// Spinner2.Visibility should be = GONE;
}
前もって感謝します。
編集:わかりました。次のコードを使用してデータベースをロードしています。
int position = MainActivity.spCat.getSelectedItemPosition()+1;
cursor = db.rawQuery("SELECT * FROM cat2 WHERE cat_id = ?" + position, null);
しかし、最初のスピナーから選択したものは何でも、2 番目のスピナーは空です。デバッグ中に、データベースのロードが最初に一度だけ呼び出されたことに気付きました。
編集2:
「?」を削除した後、動作するようになりました。私のdb.rawQueryで。ただし、2 番目のスピナーは、最初のスピナーのアイテムを変更した後のコンテンツではありません。最初のスピナーを呼び出した後、2 番目のスピナーを更新するにはどうすればよいですか?
ありがとう。