2012-03-13 14 views
0

標準のTabHostにはスピナーを含むタブがあります。私は連絡先情報でスピナーの選択肢を設定しようとしています。スピナーの内容を更新するステップが来たら、スピナーが常に空白になるようにすることを除いて、すべてが機能しているようです。私は、Spinnerアダプターのハンドルを正しく追加することができるように助けが必要だと思います。ここに私のコードです:Android - タブ内の動的スピナー - アイテムの追加に失敗しました

public class Page2Activity extends Activity 
implements OnClickListener, OnLongClickListener { 

private RadioButton rb1; 
private RadioButton rb2;  
private RadioButton rb3; 
private RadioButton rb4; 

private TextView t1; 
private Spinner s1; 
private ArrayAdapter<CharSequence> m_adapterForSpinner; 

private static final int CONTACT_PICKER_RESULT = 1001; 

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    setContentView(R.layout.tabpage2); 

    rb1 = (RadioButton) this.findViewById(R.id.DE); 
    rb2 = (RadioButton) this.findViewById(R.id.DL);  
    rb3 = (RadioButton) this.findViewById(R.id.DLL); 
    rb4 = (RadioButton) this.findViewById(R.id.DI);  

    t1 = (TextView) this.findViewById(R.id.textView1); 
    s1 = (Spinner) this.findViewById(R.id.spinner1); 

m_adapterForSpinner = new ArrayAdapter(this, android.R.layout.simple_spinner_item); 
m_adapterForSpinner.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 
s1.setAdapter(m_adapterForSpinner); 

    s1.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { 

     @Override 
     public void onItemSelected(AdapterView<?> arg0, View arg1, int arg2, long arg3) { 
      String selection = s1.getSelectedItem().toString(); 
      String[] number = selection.split(" -> "); 
      number[1] = number[1].replace("-", ""); 
      t1.setText(number[1]); 
     } 

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

     } 
     }); 

} 

上記のコードのセットアップ、私は手動でコード内のスピナーの内容を取り込む際に正常に動作するようですスピナースピナー選択ハンドラー。しかし、私は連絡先ピッカーからの連絡先情報を、プログラムでスピンナの項目としてリストしようとしています。 Pickerのハンドラは次のとおりです。ここにあるすべては、ログ記録による検証に基づいて関心のある連絡先アイテムを見つけるために働いているようですが、何らかの理由で実際にタブのSpinnerの選択肢を更新していません。その下にあるm_adapterForSpinnerを使用して問題が発生していると思いますが、その問題や解決方法についてはわかりません。助言?

 protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    if (resultCode == RESULT_OK) { 
     switch (requestCode) { 
     case CONTACT_PICKER_RESULT: 
      Uri result = data.getData(); 
      Log.v("D", "Got a result: " + result.toString()); 
      Uri myURI = Uri.parse(result.toString()) ; 
      ContentResolver cr = getContentResolver(); 
      Cursor cur = cr.query(myURI, null, null, null, null); 
      if (cur.getCount() > 0) { 
       while (cur.moveToNext()) { 
        String id = cur.getString(
           cur.getColumnIndex(ContactsContract.Contacts._ID)); 
       String name = cur.getString(
           cur.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME)); 
       Toast.makeText(this, name, 500).show(); 

       if (Integer.parseInt(cur.getString(cur.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER))) > 0) { 
        //Query phone here. Covered next 
        if (Integer.parseInt(cur.getString(
          cur.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER))) > 0) { 
          Cursor pCur = cr.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, ContactsContract.CommonDataKinds.Phone.CONTACT_ID +" = ?", new String[]{id}, null); 

          final int contactNumberColumnIndex = pCur.getColumnIndex(Phone.NUMBER); 
          final int contactTypeColumnIndex = pCur.getColumnIndex(Phone.TYPE); 

          while (pCur.moveToNext()) { 
           // Do something with phones 
           String typename = null; 
           final String number = pCur.getString(contactNumberColumnIndex); 
           final int type = pCur.getInt(contactTypeColumnIndex); 
           switch (type) { 
            case Phone.TYPE_ASSISTANT: 
             typename= "Assistant"; 
             break; 
            case Phone.TYPE_CALLBACK: 
             typename = "Callback"; 
             break; 
             break; 
            default: 
             typename = "Undefined"; 
             break; 
           } 

//は、UIを更新するには、Call m_adapterForSpinner.notifyDataSetChanged()

m_adapterForSpinner.add(typename + " -> " + number); 
          } 
        pCur.close(); 
       }}}} 
      break; 
     }} 
    else { 
     // gracefully handle failure 
     Toast.makeText(this, "Contact Selection Failed", 5000); 
    } 
} 
+0

例外またはエラーが発生しましたか?もしそうなら、ここに投稿してください... – Scorpion

+0

私はあなたにもっと簡単なアプローチをとることをアドバイスしたいと思います。まずグローバル(クラスレベルの変数)配列またはarraylistを宣言し、それを使ってoncreateでスピナーを初期化しますarrayadapterの後に)あなたがスピナーに入れたいデータを検索し終えたら、それをarraylistまたは宣言した配列に入れて、スピナーを更新します。注:あなたは変更するたびにnotifydatasetchanged()メソッドを呼び出さなければなりませんデータセットまたはスピナーの内容(具体的にはアダプター)を使用して、実際に更新します。これが役に立ちます: – Nav

答えて

0

OnActivityResultコールバックにスピナーで選択肢に項目を追加します。

またはsetNotifyOnChange(boolean notifyOnChange)と呼び出すと、UIが自動的に更新されます。したがって、m_adapterForSpinner.notifyDataSetChanged()を明示的に呼び出すことはできません。

+0

時にはnotifyDataSetChangedが機能しないので、yourAdapter.setNotifyOnChange(true)を使用できます。それは動作します。 =) –

関連する問題