【问题标题】:JSONArray to SpinnerJSONArray 到 Spinner
【发布时间】:2013-03-05 21:59:26
【问题描述】:

我有问题。我没有将 JSONArray 设置为 Spinner。我的 JSON 外观 ["category1","category2","category3"] 如何让这个 JSONArray 旋转?不知道我的代码好不好

public class Main extends Activity {

    String urlCat = "http://tvapp.pcrevue.sk/categories.json";

    @Override
    public void onCreate(Bundle icicle) {
        super.onCreate(icicle);

         JSONArray jsonArray = getJSONArrayFromUrl(urlCat);

        final ActionBar actionBar = getActionBar();
        actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_LIST);
        actionBar.setDisplayShowTitleEnabled(false);
        actionBar.setDisplayUseLogoEnabled(false);
        ArrayAdapter<String> spinnerMenu = new ArrayAdapter<String>(actionBar.getThemedContext(), android.R.layout.simple_list_item_1, jsonArray);
        actionBar.setListNavigationCallbacks(spinnerMenu, 
                new ActionBar.OnNavigationListener() {

                    @Override
                    public boolean onNavigationItemSelected(int itemPosition, long itemId) {
                        FragmentTransaction tx = getFragmentManager().beginTransaction();
                        switch (itemPosition) {
                        case 0:
                            tx.replace(android.R.id.content, new Tab1Fragment());
                            break;
                        case 1:
                            tx.replace(android.R.id.content, new Tab2Fragment());
                            break;

                        default:
                            break;
                        }
                        tx.commit();
                        return false;
                    }
                });
    }

    public JSONArray getJSONArrayFromUrl(String url) {
        InputStream is = null;
        JSONArray jObj = null;
        String json = "";
        // Making HTTP request
        try {
            // defaultHttpClient
            DefaultHttpClient httpClient = new DefaultHttpClient();
            HttpGet httpGet = new HttpGet(url);

            HttpResponse httpResponse = httpClient.execute(httpGet);
            HttpEntity httpEntity = httpResponse.getEntity();
            is = httpEntity.getContent();

        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        } catch (ClientProtocolException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

        try {
            BufferedReader reader = new BufferedReader(new InputStreamReader(is, "iso-8859-1"));
            StringBuilder sb = new StringBuilder();
            String line = null;
            while ((line = reader.readLine()) != null) {
                //json += line;
                sb.append(line + "\n");
            }
            is.close();
            json = sb.toString();
        } catch (Exception e) {
            Log.e("Buffer Error", "Error converting result " + e.toString());
        }

        // try parse the string to a JSON object
        try {
            jObj = new JSONArray(json);
        } catch (JSONException e) {
            Log.e("JSON Parser", "Error parsing data " + e.toString());
        }

        // return JSON String
        return jObj;

    }
}

我需要你的帮助。 谢谢

【问题讨论】:

    标签: android json android-actionbar android-spinner


    【解决方案1】:

    我在 ArrayAdapter 中没有找到任何接受 JSONArray 对象的构造函数,如果您有任何疑问,请参考 Array Adapter

    您需要传递 List 而不是 JSONArray。 并且, 你正在执行 UI 线程的网络操作,所以你会得到 NetworkOnMainThread 异常。低版本没问题,但高版本会抛出异常。尝试使用 AsyncTask 来获取值或 Separate Thread

    所以得到这样的列表

    ArrayList<String> list = new ArrayList<String>();
    for(int i=0; i<jsonArray.length(); i++) {
        list.add(jsonArray.getString(i));
    }
    ArrayAdapter<String> spinnerMenu = new ArrayAdapter<String>(actionBar.getThemedContext(), android.R.layout.simple_list_item_1, list);
    

    【讨论】:

      【解决方案2】:

      第一个解决方案

      其实我在 ArrayAdapter 中没有找到任何需要 JSONArray 的构造函数。 如果您的 JSONArray 包含所有字符串元素,那么

      public class MainActivity extends Activity {
      
      @Override
      protected void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
          setContentView(R.layout.activity_main);
      
          try {
              List<String> listist = new ArrayList<String>();
      
              String res = callGet("http://tvapp.pcrevue.sk/categories.json");
              JSONArray jsonArray = new JSONArray(res);
      
              for (int i = 0; i < jsonArray.length(); i++) {
                  try {
                      listist.add("" + jsonArray.get(i));
                  } catch (JSONException e) {
                      // TODO Auto-generated catch block
                      e.printStackTrace();
                  }
              }
      
              Log.e("", "listist.size() : " + listist.size());
      
          } catch (JSONException e) {
              // TODO Auto-generated catch block
              e.printStackTrace();
          } catch (Exception e) {
              // TODO Auto-generated catch block
              e.printStackTrace();
          }
      }
      
      public String callGet(String urlString) {
      
          HttpParams params = new BasicHttpParams();
          HttpConnectionParams.setSoTimeout(params, 10000);
          HttpConnectionParams.setConnectionTimeout(params, 10000);
          HttpClient httpclient = new DefaultHttpClient(params);
          HttpGet httppost = new HttpGet(urlString);
      
          try {
      
              HttpResponse response = httpclient.execute(httppost);
              return EntityUtils.toString(response.getEntity());
          } catch (Exception e) {
              return "";
          }
      }
      }
      

      我得到了我的 logcat 输出

      03-17 21:49:36.821: E/(376): listist.size() : 10
      

      第二种解决方案

      您是否尝试过GSON lib 进行 json 解析?它将 Java 对象转换为它们的 JSON 表示形式。

      List<String> listist = new ArrayList<String>();
      iidList = new Gson().fromJson(jsonArray, List.class);
      
      ArrayAdapter<String> spinnerMenu = new ArrayAdapter<String>(
                  actionBar.getThemedContext(),
                  android.R.layout.simple_list_item_1, listist);
      

      【讨论】:

        【解决方案3】:

        微调器接受数组没有问题。因此,只需从您的 json 中提取一个 java 数组并将该数组传递给微调器。网上有很多关于如何将json转成java数组的例子,比如How to parse a JSON and turn its values into an Array?。以及使用 java 数组创建微调器:Android: Create spinner programmatically from array

        【讨论】:

        • 如何从json中提取数组??
        • 请注意,我的回复为您提供了两个链接。一个用于 json 到数组,一个用于数组到微调器。如果链接stackoverflow.com/questions/2255220/…不够用,你可以去google查一下其他资源。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-05-09
        • 2016-03-02
        • 2015-01-05
        • 1970-01-01
        相关资源
        最近更新 更多