Обновить City Spinner с помощью notifyDataSetChanged после выбора состояния

Как мне обновить счетчик городов после того, как пользователь выберет штат?

Оба поля заполняются с помощью DataCall.class, который возвращает JSON данных и анализирует информацию в массив для счетчика.

Мой код ниже устанавливает для города adapter значение по умолчанию "Select State", и как только пользователь выбирает состояние, он должен использовать notifyDataSetChanged, так как массив по умолчанию для счетчика городов обновляется новыми названиями городов. Ошибки, которые я получаю, прокомментированы в моем коде ниже.

public class SearchActivity extends Activity{
       private static final String TAG = "MyApp";
       ArrayAdapter<String> adapter2;
       String city_values[] = new String[]{"Please select a state."};

       @Override
       public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.search_layout);

            final Spinner zipspinner = (Spinner) findViewById(R.id.zipspinner);
            final Spinner cityspinner = (Spinner) findViewById(R.id.cityspinner);       

            adapter2 = new ArrayAdapter<String> (this,android.R.layout.simple_spinner_item, city_values);
            adapter2.setDropDownViewResource(R.layout.city_spinner_layout);
            cityspinner.setAdapter(adapter2);

            JSONArray jsonArray;
            try {
                String spinnerContentType = "state";
                String spinnerURL = "getStoreState.php";
                String spinner_data =  DataCall.getJSON(spinnerURL,spinnerContentType); 
                Log.d(TAG, spinner_data);
                jsonArray = new JSONArray(spinner_data);

                final String[] array_spinner = new String[jsonArray.length()]; 
                for (int i=0; i<jsonArray.length(); i++) {   
                String styleValue = jsonArray.getJSONArray(i).getString(0);    
                    Log.d(TAG, styleValue);
                    array_spinner[i] = styleValue;
                }

                ArrayAdapter<String> adapter = new ArrayAdapter<String> (this, 
                                  android.R.layout.simple_spinner_item,array_spinner);
                adapter.setDropDownViewResource(R.layout.state_spinner_layout);
                zipspinner.setAdapter(adapter);
                zipspinner.setOnItemSelectedListener(new OnItemSelectedListener() {
                      public void onItemSelected(AdapterView<?> parent,View view, int pos, long id) {
                            int item = zipspinner.getSelectedItemPosition();
                            if(item != 0){

                                String item_value = array_spinner[item];
                                String spinnerContentType = "city";
                                String spinnerURL = "getStoreCity.php?state=" + item_value;
                                Log.d(TAG, spinnerURL);
                                String city_data =  DataCall.getJSON(spinnerURL,spinnerContentType); 
                                Log.d(TAG, city_data);

                                JSONArray cityArray = null;
                                try {
                                    cityArray = new JSONArray(city_data);
                                } catch (JSONException e) {
                                     e.printStackTrace();
                                }       
                                final String[] city_spinner = new String[cityArray.length()]; 

                                for (int i=0; i<cityArray.length(); i++){                       
                                    String styleValue = null;
                                    try {
                                        styleValue = cityArray.getJSONArray(i).getString(0);
                                        Log.d(TAG, styleValue);
                                    } catch (JSONException e) {
                                        e.printStackTrace();
                                    }              
                                    city_spinner[i] = styleValue;                               
                                }

                                city_values = city_spinner; 
                                adapter2.notifyDataSetChanged();

                                String test_string = "NOTIFY UPDATE";
                                Log.d(TAG, test_string);
                            } else {
                               // finish();
                            }
                        }
                        public void onNothingSelected(AdapterView parent) {
                          // Do nothing.
                        }
                   });

                   cityspinner.setOnItemSelectedListener(new OnItemSelectedListener() {
                        public void onItemSelected(AdapterView<?> parent,View view, int pos, long id) {
                            int item = zipspinner.getSelectedItemPosition();
                            if(item != 0){

                            }else{

                            }

                        }

                        public void onNothingSelected(AdapterView parent) {
                          // Do nothing.
                        }
                  });   
          }catch (JSONException e) {
                e.printStackTrace();
          }
     }
}

person Denoteone    schedule 10.09.2011    source источник
comment
вы можете обратиться к мой ответ   -  person Hanry    schedule 15.09.2011
comment
Итак, с какой проблемой вы столкнулись..?   -  person Lalit Poptani    schedule 17.09.2011
comment
Этот вопрос, как я думал, исправлен. Теперь я не получаю никаких ошибок, но мой адаптер2 не обновляется. Я думаю, что это отдельная тема, я начал другой вопрос. stackoverflow.com/ вопросы/7452550/   -  person Denoteone    schedule 17.09.2011


Ответы (3)


public class SearchActivity extends Activity {
    ArrayAdapter<String> adapter2;
    String city_values[];

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.search_layout);

        final Spinner zipspinner = (Spinner) findViewById(R.id.zipspinner);
        final Spinner cityspinner = (Spinner) findViewById(R.id.cityspinner);

        String city_values[] = new String[]{"Please select a state."};
        adapter2 = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, city_values);
        adapter2.setDropDownViewResource(R.layout.city_spinner_layout);
        cityspinner.setAdapter(adapter2);

        JSONArray jsonArray;
        final JSONArray cityArray;

        try {
            String spinnerContentType = "state";
            String spinnerURL = "getStoreState.php";
            String spinner_data = DataCall.getJSON(spinnerURL, spinnerContentType);

            jsonArray = new JSONArray(spinner_data);

            final String[] array_spinner = new String[jsonArray.length()];

            for (int i = 0; i < jsonArray.length(); i++) {
                String styleValue = jsonArray.getJSONArray(i).getString(0);
                array_spinner[i] = styleValue;
            }

            ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, array_spinner);
            adapter.setDropDownViewResource(R.layout.state_spinner_layout);
            zipspinner.setAdapter(adapter);
            zipspinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {

                public void onItemSelected(AdapterView<?> parent, View view, int pos, long id) {
                    int item = zipspinner.getSelectedItemPosition();
                    String item_value = array_spinner[item];
                    String spinnerContentType = "city";
                    String spinnerURL = "getStoreCity.php?state=" + item_value;
                    String city_data = DataCall.getJSON(spinnerURL, spinnerContentType);
                    cityArray = new JSONArray(city_data);               //The final local variable cityArray cannot be assigned, since it is defined in an enclosing type

                    final String[] city_spinner = new String[cityArray.length()];


                    for (int i = 0; i < cityArray.length(); i++) {
                        String styleValue = cityArray.getJSONArray(i).getString(0); //Unhandled exception type JSONException                
                        city_spinner[i] = styleValue;
                    }

                    city_values = city_spinner; //Unhandled exception type JSONException
                    adapter2.notifyDataSetChanged();
                }

                public void onNothingSelected(AdapterView parent {
                    // Do nothing.
                }
            });
        } catch (JSONException e) {
            e.printStackTrace();
        }
    }
}

теперь попробуй

person Mohammed Azharuddin Shaikh    schedule 15.09.2011
comment
Используя приведенный выше код city_values ​​= city_spinner; имеет красную линию под city_values, и исправление говорит о добавлении финала, но когда я это делаю, я получаю еще три ошибки. Нельзя ссылаться на неконечную переменную city_values ​​внутри внутреннего класса, определенного в другом методе. - person Denoteone; 17.09.2011
comment
Спасибо за вашу помощь. Я смог удалить все ошибки, используя приведенный выше код, а затем мне пришлось его настроить (я отредактировал свой код выше, чтобы показать изменения), и приложение запускается, но теперь адаптер2 не обновляется, что, я думаю, является отдельной проблемой. поэтому я начал новый вопрос. stackoverflow.com/ вопросы/7452550/ - person Denoteone; 17.09.2011
comment
попробуйте объявить все переменные перед onCreate(), удалите final как можно больше, а затем сообщите мне об обновлении - person Mohammed Azharuddin Shaikh; 17.09.2011
comment
было бы неплохо, если бы у этого была реальная проблема/решение, а не просто куча кода. - person mpellegr; 17.06.2016

Ну, вот как я предложу,

Прежде всего проверьте, что вы получаете значения в city_values. Затем уведомите адаптер.... adapter2.notifyDataSetChanged(); И, наконец, cityspinner.setSelection(0);

UPDATE:

Я бы посоветовал покататься ArrayList<String> instead of String[]

Спасибо...

person Lalit Poptani    schedule 17.09.2011
comment
Я отладил, и да, city_values ​​получает значения, но когда я уведомляю DataSetChanged(), cityspinner не показывает новые значения массива. Спасибо за информацию +1 - person Denoteone; 17.09.2011
comment
Смотрите мой ответ на обновление ... Пожалуйста, используйте ArrayList, он точно будет работать нормально ... Спасибо .. - person Lalit Poptani; 17.09.2011
comment
Пробую сейчас. Я дам вам знать. - person Denoteone; 17.09.2011

Объявите переменную city_array в том месте, где вы назначаете new JSONArray(). В любом случае вы используете его временно. Просто установите адаптер снова.

person Ronnie    schedule 10.09.2011
comment
Вот как я изначально это делал, см. мой пост несколько недель назад: stackoverflow.com/questions/7213115/, но затем я получаю сообщение об ошибке в новом ArrayAdapter‹String› (это, android.R .layout.simple_spinner_item, city_values); - person Denoteone; 10.09.2011