2012-03-13 54 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的处理程序。这里的一切似乎都在努力通过日志记录查找基于验证的感兴趣的联系人项目,但由于某种原因,它实际上并未在选项卡上更新微调器中的选项。我认为这是我使用下面的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; 
           } 

//将项添加到选择的微调在OnActivityResult回调

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

您是否收到任何异常或错误?如果是,那么请在这里发布...... – Scorpion 2012-03-13 05:52:49

+0

我建议你去用一个更简单的方法...首先声明一个全局(类级别变量)数组或ArrayList,无论你喜欢然后初始化微调oncreate与(使用arrayadapter当然)之后,当您完成检索您想要放入微调器的数据时,将其放入数组列表或您声明的数组中,然后更新微调器。注意:无论何时更改,都必须调用notifydatasetchanged()方法数据集或微调器的内容(适配器是特定的),然后再实际更新它。希望这有助于:) – Nav 2012-03-13 06:01:16

回答

0

呼叫m_adapterForSpinner.notifyDataSetChanged()来更新UI。

或致电setNotifyOnChange(boolean notifyOnChange)这会自动更新用户界面。所以你不应该明确地打电话给m_adapterForSpinner.notifyDataSetChanged()

+0

有时notifyDataSetChanged不起作用,所以你可以使用yourAdapter.setNotifyOnChange(true);它会起作用。 =) – 2014-09-29 16:41:25