1

次の問題があります: 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 番目のスピナーを更新するにはどうすればよいですか?

ありがとう。

4

2 に答える 2

0

アイテムの順序がテーブルのカテゴリに対応している場合は、使用を試みることができcatAdapter.selectedItemPositionます。選択したアイテムの位置は0から始まるためcatAdapter.selectedItemPosition + 1、spinner1で選択されている値を知ることができるように使用する必要があります。また、あなたは次のようなものを使うことができます

if (Integer.toString(catAdapter.selectedItem)=="1" 
{
  //put some code to tell number 1 is selected on the catAdapter
}
于 2012-08-29T11:25:37.850 に答える
0

クエリを実行できます:

Select * From cat2 where cat1_id==cat_id
于 2012-08-29T10:57:47.693 に答える