Android - Динамический спиннер во вкладке - Сбой добавления элемента - PullRequest
0 голосов
/ 13 марта 2012

У меня есть стандартный TabHost с вкладкой, содержащей Spinner. Я пытаюсь заполнить выбор счетчика контактной информацией. Кажется, все работает, за исключением того, что когда наступает этап обновления содержимого счетчика, этого не происходит, поэтому счетчик остается пустым все время. Я думаю, что мне нужна помощь, чтобы правильно захватить рукоятку адаптера Spinner таким образом, чтобы добавление происходило. Вот мой код:

    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 

        } 
        }); 

}

Приведенный выше код настраивает обработчик выбора счетчика и счетчика, который работает нормально, когда я вручную заполняю содержимое счетчика в коде. Тем не менее, я пытаюсь перечислить контактную информацию из средства выбора контактов в качестве элементов в счетчике программным способом. Вот обработчик для сборщика. Кажется, что все здесь работает, чтобы найти интересующие элементы контакта на основе проверки посредством регистрации, но по какой-то причине он фактически не обновляет варианты в 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;
                                }

// Добавить элемент в варианты в Spinner в обратном вызове OnActivityResult

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

1 Ответ

0 голосов
/ 13 марта 2012

Позвоните m_adapterForSpinner.notifyDataSetChanged(), чтобы обновить пользовательский интерфейс.

Или позвоните setNotifyOnChange(boolean notifyOnChange), чтобы автоматически обновить пользовательский интерфейс.Таким образом, вы не должны вызывать m_adapterForSpinner.notifyDataSetChanged() явно.

...