2013-03-17 7 views
3

У меня проблема. Я не устанавливаю JSONArray в Spinner. Мой JSON посмотреть ["category1","category2","category3"] Как получить этот JSONArray для вращения? Я не знаю, хорошо ли мой кодJSONArray to Spinner

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; 

    } 
} 

Мне нужна ваша помощь. Thx

ответ

1

Я не нашел конструктора в ArrayAdapter, который принимает объект JSONArray, если у вас есть сомнения, обратитесь к Array Adapter.

Вам необходимо передать список вместо JSONArray. А также, Вы определяете сетевую работу потока пользовательского интерфейса, поэтому вы получите исключение NetworkOnMainThread. Это будет нормально для более низких версий, но более сложная версия будет генерировать исключение. Попробуйте использовать AsyncTask для получения значений или отдельный поток

Так получите список как этот

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

Первое решение

На самом деле я не нашел конструктор в 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 Библиотека для разбора 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); 
+0

Не работает ни один :( –

0

Spinners не имеет проблем с принятием массивов. Поэтому просто извлеките массив java из json и передайте этот массив на счетчик. Есть много примеров онлайн о том, как превратить json в массив java, например How to parse a JSON and turn its values into an Array?. А для создания spinner с массивом java: Android: Create spinner programmatically from array

+0

Как извлечь массив из json? –

+0

Обратите внимание, что мой ответ дает вам две ссылки: одну для json для массива и одну для массива для spinner. Это ссылка http://stackoverflow.com/questions/2255220/how-to-parse-a-json-and-turn-its-values-into-an-array недостаточно, вы можете посмотреть ее на google и проверьте другие ресурсы. – learner

+0

Я пробовал много примеров, но ни один из них не работал. –