ntgCleaner
ntgCleaner

Reputation: 5985

Android Spinner setOnItemSelectedListener not working

I have made a spinner dynamically during a login process. I'd like to be able to return the value of the spinner when I click on an option but it doesn't seem to work.

I make the spinner here:

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();

then I try to use the spinner here:

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 ");
    }
});

I don't ever get the Log.d or even if I made Toast there, it doesn't fire. Not sure why this is stopping and I'm not getting any errors.

Any ideas?

Upvotes: 4

Views: 10451

Answers (3)

Shree Krishna
Shree Krishna

Reputation: 8562

I've tested your codes and everything seems Right here. First I tried Adding 10 Items at spinner. Everything worked fine. And I tested adding List of String which contains only one Item.

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

My 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) {

            }
        });

But what happened is the code everything worked fine before was not working after because there is only one item in spinnerArray. Toast was shown when Activity loads and not called when item is selected. You may have the same issue there. So my suggestion is give priority to your Array which may contain only one item.

Upvotes: 0

Alberto Crespo
Alberto Crespo

Reputation: 2519

Declare the spinner as a global variable and without final

and try this:

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();
    }
});

Upvotes: 3

Chintan Soni
Chintan Soni

Reputation: 25267

Your error seems somewhat correct. You are not notifying adapter about the changes in dataset.

Firstly, Your request is executed Async. So, your code execution will continue to next lines. So I guess, a blank array (size 0) is passed to ArrayAdapter<> and then the adapter is set to Spinner and then you are calling notifyDataSetChanged().

I think you should call spinnerArrayAdapter.notifyDataSetChanged();as below:

    @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();
    }

Upvotes: 2

Related Questions