2016-02-23 2 views
2

Я сделал динамик динамически во время процесса входа в систему. Я хотел бы иметь возможность вернуть значение счетчика, когда я нажимаю на параметр, но он, похоже, не работает.Android Spinner setOnItemSelectedListener не работает

я сделать вертушку здесь:

public Spinner page_spinner; 

protected void onCreate(Bundle savedInstanceState){ 
... 
page_spinner = (Spinner) findViewById(R.id.page_spinner); 
... 
//MAKE ARRAY HERE 
GraphRequest requestPage = GraphRequest.newGraphPathRequest(
    currentAccessToken, 
    "/me/accounts", 
    new GraphRequest.Callback() { 
     @Override 
     public void onCompleted(GraphResponse response) { 
      JSONArray jsonArray = null; 
      try { 
       jsonArray = response.getJSONObject().getJSONArray("data"); 
       for(int i=0; i < jsonArray.length(); i++){ 
       JSONObject page = jsonArray.getJSONObject(i); 
       String pageName = page.getString("name"); 
       if(!pageName.equals("")) { 
        //Push names into the array 
        pages_array.add(pageName); 
       } else { 
        pages_array.clear(); 
       } 
      } 
     } catch (JSONException e) { 
      e.printStackTrace(); 
     } 
    } 
}); 
Bundle pageParameters = new Bundle(); 
pageParameters.putString("fields", "name,access_token,picture{url}"); 
requestPage.setParameters(pageParameters); 
requestPage.executeAsync(); 
... 
ArrayAdapter<String> spinnerArrayAdapter = new ArrayAdapter<String>(StartPage.this, android.R.layout.simple_spinner_item, pages_array); 
spinnerArrayAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); // The drop down view 
page_spinner.setAdapter(spinnerArrayAdapter); 
spinnerArrayAdapter.notifyDataSetChanged(); 

тогда, когда я пытаюсь использовать блесну здесь:

page_spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { 
    @Override 
    public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { 
     Log.d("***********", "THIS "); 
    } 
    @Override 
    public void onNothingSelected(AdapterView<?> parent) { 
     Log.d("***********", "THIS "); 
    } 
}); 

Я никогда не получить Log.d или даже если я сделал Toast там, не срабатывает. Не знаю, почему это останавливается, и я не получаю никаких ошибок.

Любые идеи?

+0

Вы можете добавить инициализацию и код генерации массива, а также для примера –

+0

@RajenRaiyarela, Добавлено, но сейчас я редактирую комментарии и экстраординарный код прямо сейчас – ntgCleaner

+0

@RajenRaiyarela, я отбраковал код, поэтому он показывает, как я 'm making the array – ntgCleaner

ответ

1

Объявить вертушку в качестве глобальной переменной и без final

и попробовать это:

page_spinner = (Spinner) findViewById(R.id.page_spinner); 
... 
//MAKE ARRAY HERE 
GraphRequest requestPage = GraphRequest.newGraphPathRequest(
    currentAccessToken, 
    "/me/accounts", 
    new GraphRequest.Callback() { 
     @Override 
     public void onCompleted(GraphResponse response) { 
      JSONArray jsonArray = null; 
      try { 
       jsonArray = response.getJSONObject().getJSONArray("data"); 
       for(int i=0; i < jsonArray.length(); i++){ 
       JSONObject page = jsonArray.getJSONObject(i); 
       String pageName = page.getString("name"); 
       if(!pageName.equals("")) { 
        //Push names into the array 
        pages_array.add(pageName); 
       } else { 
        pages_array.clear(); 
       } 
      } 
     } catch (JSONException e) { 
      e.printStackTrace(); 
     } 
     ArrayAdapter<String> spinnerArrayAdapter = new ArrayAdapter<String>(StartPage.this, android.R.layout.simple_spinner_item, pages_array); 
     spinnerArrayAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); // The drop down view 
     page_spinner.setAdapter(spinnerArrayAdapter); 
     spinnerArrayAdapter.notifyDataSetChanged(); 
    } 
}); 
+0

Спасибо, я просто попробовал это, но все еще ничего в консоли – ntgCleaner

+0

Создайте свой счетчик перед «обратным вызовом» и установите адаптер внутри «Обратного вызова», когда ваш массив завершен –

+0

Ваш комментарий сделал трюк - я помещаю две строки, начинающиеся с «ArrayAdapter » и 'spinnerArrayAdapter' в' onComplete' 'GraphRequest.Callback()', чуть выше строки 'try {'. Затем я разместил 'page_spinner' и' spinnerArrayAdapter' как раз под последним 'catch' – ntgCleaner

2

Ваша ошибка кажется несколько правильным. Вы не уведомляете адаптер об изменениях в наборе данных.

Во-первых, ваш запрос выполнен Async. Таким образом, выполнение кода будет продолжаться до следующих строк. Поэтому я предполагаю, что пустой массив (размер 0) передается в ArrayAdapter<>, а затем адаптер установлен на Spinner, а затем вы вызываете notifyDataSetChanged().

Я думаю, вы должны позвонить spinnerArrayAdapter.notifyDataSetChanged();, как показано ниже:

@Override 
    public void onCompleted(GraphResponse response) { 
     JSONArray jsonArray = null; 
     try { 
      jsonArray = response.getJSONObject().getJSONArray("data"); 
      for(int i=0; i < jsonArray.length(); i++){ 
       JSONObject page = jsonArray.getJSONObject(i); 
       String pageName = page.getString("name"); 
       if(!pageName.equals("")) { 
        //Push names into the array 
        pages_array.add(pageName); 
       } else { 
        pages_array.clear(); 
       } 
      } 
      spinnerArrayAdapter.notifyDataSetChanged(); 
    } catch (JSONException e) { 
     e.printStackTrace(); 
    } 
+0

Спасибо, это займет 23 часа, чтобы наградить щедростью. У вас есть больше объяснений, хотя другие три строки кода также должны перемещаться. Как и ответ Альберто. – ntgCleaner

+0

@ntgCleaner Не проблема. Вы понимаете, почему вы совершаете ошибку, важнее. Баунти не будет представлять навыки .. :) Happy Coding .. –

0

Я проверил свои коды и все, кажется, прямо здесь. Сначала я попытался добавить 10 предметов по адресу spinner. Все работало нормально. И я протестировал добавление List из String, который содержит только один элемент.

List<String> spinnerArray = new ArrayList<String>(); 
     spinnerArray.add("Item 1"); 

Мои OnItemSelectedListener

spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { 
      @Override 
      public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { 
       Toast.makeText(MainActivity.this, "Selected", Toast.LENGTH_SHORT).show(); 
      } 

      @Override 
      public void onNothingSelected(AdapterView<?> parent) { 

      } 
     }); 

Но то, что произошло это код все работало нормально до этого не работал после того, потому что есть только один пункт в spinnerArray. Toast было показано, когда Activity загружается и не вызывается, когда выбрано item. У вас может быть такая же проблема. Поэтому мое предложение отдает приоритет вашему Array, который может содержать только один item.

Смежные вопросы