Android Spinner setOnItemSelectedListener不起作用

时间:2016-02-23 22:14:02

标签: android spinner

我在登录过程中动态制作了微调器。我希望能够在单击某个选项时返回微调器的值,但它似乎不起作用。

我在这里制作微调器:

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,它也不会发射。不知道为什么这会停止,我没有收到任何错误。

有什么想法吗?

3 个答案:

答案 0 :(得分:2)

将微调器声明为全局变量且没有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();
    }
});

答案 1 :(得分:2)

您的错误似乎有点正确。您没有通知适配器有关数据集中的更改。

首先,您的请求执行异步。因此,您的代码执行将继续下一行。所以我想,一个空白数组(大小为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();
    }

答案 2 :(得分:0)

我已经测试了你的代码,一切似乎都在这里。首先,我尝试在spinner添加10个项目。一切都很好。我测试了添加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,其中只能包含一个abs