2010-11-26 15 views
0

私はSpinner、カーソル、およびアダプターを扱っています。Androidスピナー "onclicklistener"質問

スピナーのクリックリスナーを設定して、スピナーからアイテムを選択すると、現在選択されているアイテムを取得してから、他のタスクを実行します(この追加コードはすべて問題ありません。私は持っている)....しかし、それは作品の種類が、setOnItemSelectedListenerコールバックを宣言した後、カーソルがすでに設定されているので、イベントは、アプリケーションが起動するとすぐに発生します。

最初の項目を選択せず​​にカーソルを定義する方法が必要なので、イベントが発生しないようにしてください(項目が選択されないため)。それともこれを達成するためのより良い方法がありますか?

基本的には、アプリケーションがロードされると、カーソルが設定されているため(setiNitemSelectedListener関数が起動しています)、私は思っています。さらに、イベントがあまりにも早く発砲しているという事実を無視して、スピナーで-same-アイテムを選択すると、アイテムが変更されなかったためイベントが発生しません。私はsetonitemslectedlistenerの代わりに別のコールバックを使用すべきですか?ここに私がこれまで持っていたコードがあります。

  c = db.getallrecents(); 
    startManagingCursor(c); 

    busnumspinner = (Spinner) findViewById(R.id.Spinner01); 

     SimpleCursorAdapter spinneradapter = new SimpleCursorAdapter(this, 
       R.layout.lvlayout, c, spincol, spinto); 

    busnumspinner.setAdapter(spinneradapter); 


    busnumspinner.setOnItemSelectedListener(new OnItemSelectedListener() { 
     @Override 
     public void onItemSelected(AdapterView<?> parentView, View selectedItemView, int position, long id) { 
      String spinnerString = null; 
      Cursor cc = (Cursor)(busnumspinner.getSelectedItem()); 
      if (cc != null) { 
       spinnerString = cc.getString(
        cc.getColumnIndex("busnum")); 
       text = spinnerString; 
      } 

      showDialog(DATE_DIALOG_ID); 

     } 

     @Override 
     public void onNothingSelected(AdapterView<?> parentView) { 
      // your code here 
     } 
    }); 
+0

私は私の答えを編集したが、しかし私はそこに、それはそれは、コールバックが定義されると、発射ラウンド私の問題、イベントのつまり問題のいずれかを取得します – Javi

答えて

3

これは既にquestionで論じられています。そこには見えますが、盲目的に与えられたような同様の答えがあります。

EDIT:あなたがそれを必要とするときonItemSelectedListenerが発射されていない場合

、あなたはおそらくドロップリストのeachtext項目にonClickListenerを必要とし、そこにスピナーの選択した項目の現在位置を取得します。問題は、hereスピナーがこのイベントをサポートしていないと言われていますが、おそらくこのstackoverflow questionで説明されているようなことをすることで取得できます。私はそれを試していないので、私はそれが動作するのか分からない。

+0

本当にjavi、ブール値を使用すると、初めてイベントの発生を停止するように動作します。 2回目のスピンナーで同じアイテムを選んだ場合、どのようにして発砲しないというイベントの2番目の問題に対処できますか?任意のアドバイスは歓迎です – brux

+0

おかげさまで助けてくれてありがとうjavi。正直言って、これを回避するためにUIを改作するつもりです。 – brux

+0

@brux良いアイデア – Javi

2

は、それがシステム、そのないきれいな解決策が選択します最初の時間を無視するブールフラグを使用しますが、私は何回、このカップルと苦戦し、より良い解決策を見つけたことがありません。

+1

役に立てば幸いスピナー内の同じアイテムが選択されている場合、イベントを発生させることができないという問題は依然としてあります。/ – brux

+0

私は個人的にこの問題の解決策を見つけませんでした。私はちょうどUIの背後にあるロジックを修正しました。たぶん、ボタンを追加しますか?誰かがこれに対する解決策を持っているなら、私にとっても大きな助けになるでしょう。 – blindstuff

+0

ok thanks blindstuff、私はUIを再加工するつもりですが、javiによって提供されるソリューションはうまくいくはずです。とにかくあなたに親指を与えます!ありがとう – brux

1

あなたはselectvaluesのようなデフォルト値でスピナーの最初の項目を追加し、onitemselectedリスナー内での位置を確認し、それがゼロ位置だならば、0よりも大きいループに入るいけない、メソッド

に入力することができますは、例を参照してください

bindViewをオーバーライドし、

があなたのSimpleCursorAdapterを拡張()と行ビューのOnClickListener設定:

busnumspinner.setOnItemSelectedListener(new OnItemSelectedListener() { 
    @Override 
    public void onItemSelected(AdapterView<?> parentView, View selectedItemView, int 
    position, long id) { 
    if(position!=0) 
    { 
     String spinnerString = null; 
     Cursor cc = (Cursor)(busnumspinner.getSelectedItem()); 
     if (cc != null) { 
      spinnerString = cc.getString(
       cc.getColumnIndex("busnum")); 
      text = spinnerString; 
     } 
     } 

    So this is not run the default value 
0

これを試してみてください。

これは、両方の問題を克服します:あなたは、最初の呼び出しを得ることはありません、あなたはそれぞれの選択クリック(INC再選択を。)を取得

を使用すると、サンプルコードが必要な場合は、私に教えてください。

EDIT:コード例:

protected class NoteAdapter extends SimpleCursorAdapter { 

    // Constructor 
    public NoteAdapter(Context context, Cursor c) { 
     super(context, R.layout.etb_items_strip_list_item, c, fromNote, toNote); 
    } 


    // This is where the actual binding of a cursor to view happens 
    @Override 
    public void bindView(View row, Context context, Cursor cursor) { 
     super.bindView(row, context, cursor); 

     // Save id 
     Long id = cursor.getLong(cursor.getColumnIndex("_id")); 
     row.setTag(id); 

     // Set callback 
     row.setOnClickListener(row_OnClick); 
    } 

    // Callback: Item Click 
    OnClickListener row_OnClick = new OnClickListener(){ 
     public void onClick(View v) { 
      Long id = (Long) v.getTag(); 
     } 
    }; 

} 
+0

OferRはいくつかのコードを私に提供することができます... –