【问题标题】:how to get associated other json value in spinner when an item selected选择项目时如何在微调器中获取关联的其他json值
【发布时间】:2015-05-09 01:35:04
【问题描述】:

我正在尝试一个简单的应用程序,我在其中使用从网络调用中获得的值(json 值)填充微调器。但是当从微调器中选择一个项目时,我不知道如何获取关联的 json 值。谁能给我一篇关于如何做到这一点的文章/参考?

这是我的 json 响应

{
item: {
       name: "xyz",
       brands: [
                {
                 id: 123,
                 name: "abc"
                }
               ]
     }
}

这就是我解析 json 的方式。

public class user_activity extends ActionBarActivity {
RequestQueue queue;
    ArrayList<String> brand_list = new ArrayList<String>();
    Spinner spinner;
    String brand_id;

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_user_activity);
        this.spinner= (Spinner) findViewById(R.id.spinner);
        loadUser();
    }

public void loadUser() {
        final ProgressDialog pDialog = new ProgressDialog(this);
        pDialog.setMessage("Please Wait..");
        pDialog.show();
        queue = Volley.newRequestQueue(this);
        String url = "http://myApiUrl";
        JsonObjectRequest postRequest = new JsonObjectRequest(Request.Method.GET, url,
                new Response.Listener<JSONObject>()
                {
                    @Override
                    public void onResponse(JSONObject response) {
                        pDialog.hide();
                        try {
                            JSONArray array = response.getJSONObject("item").getJSONArray("brands");
                            for (int i=0; i< array.length();i++) {
                                String b = array.getJSONObject(i).getString("name");
                                brand_list.add(b);
                            }
                            ArrayAdapter<String> adapter;
                            adapter = new ArrayAdapter<String>(user_activity.this,android.R.layout.simple_dropdown_item_1line,brand_list);
                            spinner.setAdapter(adapter);
                            spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
                                @Override
                                public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) {
                                    Toast.makeText(getBaseContext(),spinner.getSelectedItem().toString(),Toast.LENGTH_LONG).show();
                                }
                                @Override
                                public void onNothingSelected(AdapterView<?> adapterView) {

                                }
                            });

                        } catch (JSONException e) {
                            e.printStackTrace();
                            pDialog.hide();
                        }
                    }
                },
                new Response.ErrorListener()
                {
                    @Override
                    public void onErrorResponse(VolleyError error) {
                        // error
                        Log.d("Error.Response", String.valueOf(error));
                    }
                }
        );
        queue.add(postRequest);

    }

我想通过按钮意图将关联的 id 值(即“123”)发送到下一个活动。

编辑: 修改代码如下

但是函数集微调器总是返回empty

public class user_activity extends ActionBarActivity {

    String phone_number;
    String access_token;
    Button enterButton;
    String brand_id;
    TextView uName;
    RequestQueue queue;
    ArrayList<String> brand_list = new ArrayList<String>();
    ArrayList<String> _ids = new ArrayList<String>();
    Spinner spinner;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_user_activity);
        this.phone_number = getIntent().getStringExtra("phone");
        this.access_token = getIntent().getStringExtra("token");
        enterButton = (Button)findViewById(R.id.buttonEnter);
        uName = (TextView) findViewById(R.id.tvName);
        this.spinner= (Spinner) findViewById(R.id.spinner);
        loadUser(phone_number, access_token);
//        nextActivity(b[0]);
    }

    public void loadUser(String phone, String token) {
        final ProgressDialog pDialog = new ProgressDialog(this);
        pDialog.setMessage("Please Wait..");
        pDialog.show();
        queue = Volley.newRequestQueue(this);
        final String[] message = new String[1];
        final String[] my_id = new String[1];
        String url = "http://api_url";
        JsonObjectRequest postRequest = new JsonObjectRequest(Request.Method.GET, url,
                new Response.Listener<JSONObject>()
                {
                    @Override
                    public void onResponse(JSONObject response) {
                        pDialog.hide();
                        try {
                            message[0] = response.getJSONObject("item").getString("name");
                            uName.setText(message[0]);
                            JSONArray array = response.getJSONObject("item").getJSONArray("brands");
                            for (int i=0; i< array.length();i++) {
                                String b = array.getJSONObject(i).getString("name");
                                String id = array.getJSONObject(i).getString("id");
                                _ids.add(id);
                                brand_list.add(b);
                            }
                            String id = setSpinner();

                        } catch (JSONException e) {
                            e.printStackTrace();
                            pDialog.hide();
                        }
                    }
                },
                new Response.ErrorListener()
                {
                    @Override
                    public void onErrorResponse(VolleyError error) {
                        // error
                        Log.d("Error.Response", String.valueOf(error));
                    }
                }
        );
        queue.add(postRequest);
    }

    public String setSpinner(){
        ArrayAdapter<String> adapter;
        final String[] id = new String[1];
        adapter = new ArrayAdapter<String>(user_activity.this,android.R.layout.simple_dropdown_item_1line,brand_list);
        spinner.setAdapter(adapter);
        spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
            @Override
            public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) {
                id[0] = _ids.get(i);
//                Toast.makeText(getBaseContext(), id[0] + ":" + spinner.getSelectedItem().toString(), Toast.LENGTH_SHORT).show();
            }

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

            }
        });
        Toast.makeText(getBaseContext(), id[0].toString() , Toast.LENGTH_SHORT).show();
        return id[0];
    }

【问题讨论】:

  • 我同意@M D 方法,该方法使用您的代码完成,无需任何其他额外努力。
  • 如果有帮助,请检查我的答案,

标签: android json spinner android-spinner


【解决方案1】:

有很多方法。

一种方法是创建idarrayList

 ArrayList<String> _ids = new ArrayList<String>();

JSON 中的值添加到此arryList

 String id = array.getJSONObject(i).getString("id");
_ids.add(id);

然后在你的spinner.setOnItemSelectedListener(....)中使用它

  spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
  @Override
  public void onItemSelected(AdapterView<?> adapterView, View view, int position, long l) {

    String id=_ids.get(position);//Used this id to pass to another Activity 

    }
    ....
  });

【讨论】:

  • @M D 除了你的答案位置是第三个参数,即iString id = _ids.get(i)
  • @h.APP.y 你的i=position 在我的情况下。
  • @M D 如果我设置brand_id = id; 它会在函数之外显示brand_id=null。如何在函数内将id 分配给brand_id
【解决方案2】:

我认为您需要先将数据存储在如下数组列表中..

JSONArray array = response.getJSONObject("item").getJSONArray("brands");
    for (int i=0; i< array.length();i++) {
    JSONObject mItemObject = array.getJSONObject(i);
    String b = mItemObject.getString("name");
    brand_list.add(b);
    JSONArray mBrandsArray = mItemObject.getJSONArray("brands");
    JSONObject mBrandsObject = mBrandsArray.getJSONObject(0);
    String brandsId = mBrandsObject.getString("id");
    String brandsName = mBrandsObject.getString("name");
    brand_id.add(brandId); //make this array list likebrand_list
    brand_name.add(brandName); //make this array list like ..
}

然后在你的微调器中

spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
    @Override
    public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) {
        Toast.makeText(getBaseContext(),spinner.getSelectedItem().toString(),Toast.LENGTH_LONG).show();

        Intent mIntent = new Intent(this, NewActivity.class);
        // load data using putExtra
        mIntent.putExtra("id", brand_id.get(i));
        ...
        ...
        startActivity(mIntent);

    }
    @Override
    public void onNothingSelected(AdapterView<?> adapterView) {
    }
});

【讨论】:

  • 您的回答只是我回答的扩展版本。不过没关系。
  • 没有。没关系。你仍然得到+1(你的时间)。
【解决方案3】:

创建一个名为 Brand 的类,如下所示

    class Brand {
    int id;
    String name;

    @Override
    public String toString() {
        return name;
    }
}

现在更改您的解析代码并使用 Brand 对象代替刚刚获取名称并将其添加到 brand_list。一旦用户选择任何内容,您就可以获得所选索引找到品牌对象并将对象的 id 发送到其他活动。

【讨论】:

    【解决方案4】:

    您需要创建自己的OnItemSelectedListener 接口,并将其放置到spinner.setOnItemSelectedListener(listener) 的微调器中。你的 listener 对象应该看起来像

    listener = new OnItemSelectedListener() {
        public void onItemSelected(AdapterView<?> parent, View v, int position, long id) {
            JSONObject selectedObject = globalItemsObject.optJSONObject(position);
            //make some actions with "selectedObject" 
        }
    
        public void onNothingSelected(AdapterView<?> parent) {
        }
    
    };
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多