2016-08-25 2 views
0

Я довольно новичок в Android, и мне всего два месяца или около того на нем, поэтому, пожалуйста, будь красивым =) Я получаю ошибку в результате строки из-за String [] items требуется заполнить адаптер адаптера Array.заполнять данные массива json в android dynamic spinner

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_select_class); 

    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
    setSupportActionBar(toolbar); 

    getSupportActionBar().setDisplayHomeAsUpEnabled(true); 

    /**dropdown start**/ 
    populatedata(); 
    spinnercall(result); 
    /**dropdown end**/ 
} 

private void spinnercall(result) { 

    Spinner dynamicSpinner = (Spinner) findViewById(R.id.dynamic_spinner); 

    //String[] items = new String[] { "Chai Latte", "Green Tea", "Black Tea" }; 
    String items = result; 

    ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, items); 

    dynamicSpinner.setAdapter(adapter); 

    dynamicSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { 

     @Override 
     public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { 
      Log.v("item", (String) parent.getItemAtPosition(position)); 
     } 
     @Override 
     public void onNothingSelected(AdapterView<?> parent) { 
      // TODO Auto-generated method stub 
     } 
    }); 

} 

private String populatedata() { 
    try{ 
     SharedPreferences pref = getApplicationContext().getSharedPreferences("MyPref", MODE_PRIVATE); 
     String userid =pref.getString("userid", "null"); 

     String link="selectclass.php"; 
     String data = URLEncoder.encode("id", "UTF-8") + "=" + URLEncoder.encode(userid, "UTF-8"); 

     URL url = new URL(link); 
     URLConnection conn = url.openConnection(); 

     conn.setDoOutput(true); 
     OutputStreamWriter wr = new OutputStreamWriter(conn.getOutputStream()); 

     wr.write(data); 
     wr.flush(); 

     BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream())); 

     StringBuilder sb = new StringBuilder(); 
     String line = null; 

     // Read Server Response 
     while((line = reader.readLine()) != null) 
     { 
      sb.append(line); 
      break; 
     } 

     result = sb.toString(); 
     return result; 
    } 
    catch(Exception e){ 
     String errorno; 
     errorno = ("Exception: " + e.getMessage()); 
     Toast.makeText(getApplicationContext(), errorno, Toast.LENGTH_SHORT).show(); 
    } 

} 

это мой selectclass.php код

$sql = "SELECT subejct_id, subject_name FROM class_schedule where subject_lec = '$id'"; 
$res = $conn->query($sql); 
$result = array(); 

if ($res->num_rows > 0) { 
    // output data of each row 
    while($row = $res->fetch_array()){ 

     array_push($result, array('subject_id'=>$row[0], 'subject_name'=>$row[1])); 

     echo json_encode(array("result"=>$result)); 
    } 
} else { 
    echo "fail"; 
} 

по четкой задаче объяснить, проблема, которую я столкнулся находится в

// Read Server Response 
     while((line = reader.readLine()) != null) 
     { 
      sb.append(line); 
      break; 
     } 
    result = sb.toString(); 
    return result; 
} 

и

//String[] items = new String[] { "Chai Latte", "Green Tea", "Black Tea" }; 
    String items = result; 

    ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, items); 

в то время как// отлично работает, но я не хочу dcoded.

+2

Из того, что я понимаю, вы загружаете JSON и хотите добавить значения в ArrayAdapter, но элементы не являются массивом. Все, что вам нужно сделать, - разобрать ответ JSON. Имейте приятный [читать] (http://crunchify.com/how-to-read-json-object-from-file-in-java/). – Abbas

+0

ArrayAdapters будут принимать массивы и коллекции. Я вижу, что вы передаете строку, которая не будет работать. – SripadRaj

ответ

1

Предполагая, что ваш JSON выглядит следующим образом:

[{"subject_id":"123","subject_name":"123Name"},{"subject_id":"123","subject_name":"123Name"}] 

Вы можете разобрать его на массив с этим кодом:

Gson gson = new Gson(); 
Subject[] items = gson.fromJson(jsonString, Subject[].class); 

С этой помощью этого класса объекта:

class Subject { 
    public String subject_id = ""; 
    public String subject_name = ""; 
} 

Это не будет работать напрямую с ArrayAdapter, хотя вам потребуется либо специальный адаптер, чтобы вытащить только v вы хотите или создать новый массив только с именами subject_name.

Как упоминалось в других комментариях, использование библиотеки для совершения вызовов REST упростит ваш код и сделает его намного более устойчивым. Вот пример использования Volley:

String url = "http://address/path"; 
RequestQueue queue = Volley.newRequestQueue(appContext); 

StringRequest stringRequest = new StringRequest(Request.Method.GET, url, 
       new Response.Listener<String>() { 
        @Override 
        public void onResponse(String response) { 

         Log.d("TAG", "success, parse your json here: " + response); 
         // Populate your ArrayList 
         // notify adapter of the dataset change 
        } 
       }, new Response.ErrorListener() { 
      @Override 
      public void onErrorResponse(VolleyError error) { 

      } 
     }); 

queue.add(stringRequest); 

Update (Добавление списка библиотек асинхронной HTTP):

Volley составляет от Google

Retrofit является сообщество предложение от площади

Android Aysnc - Open источник предложения от James Smith

+0

залп отличается от звонка REST, который упоминает другой комментатор? –

+0

Да, я добавил список в свой первоначальный ответ со списком каждого –

0

Я решил использовать декодер объектов json

try{ 
      JSONObject person = new JSONObject(result); 
      JSONArray jsonMainNode = person.getJSONArray("result"); 
      final int n = jsonMainNode.length(); 

      //List<Map<String,String>> classList = new ArrayList<Map<String,String>>(); 
      final ArrayList<HashMap> classList = new ArrayList<>(); 
      String[] spinnerArray = new String[n]; 
      HashMap<String,String> spinnerMap = new HashMap<>(); 

      for(int i = 0; i< n; i++){ 
       JSONObject jsonChildNode = jsonMainNode.getJSONObject(i); 

       String schedule_id = jsonChildNode.getString("schedule_id"); 
       String subject_name = jsonChildNode.getString("subject_name"); 

       spinnerMap.put(schedule_id, subject_name); 
       classList.add(spinnerMap); 

       String total = "Class Section : "+schedule_id+" "+subject_name; 
       spinnerArray[i] = total; 
      } 

      Spinner dynamicSpinner = (Spinner) findViewById(R.id.dynamic_spinner); 
      ArrayAdapter<String> adapter = new ArrayAdapter<>(this, android.R.layout.simple_spinner_item, spinnerArray); 
      dynamicSpinner.setAdapter(adapter); 

      dynamicSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { 
       @Override 
       public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { 
        String classid = classList.get(position); 
        Log.v("item", (String) parent.getItemAtPosition(position)); 
       } 
       @Override 
       public void onNothingSelected(AdapterView<?> parent) { 
        // TODO Auto-generated method stub 
       } 
      }); 
     } 
     catch(JSONException e){ 
      Toast.makeText(getApplicationContext(), "Error"+e.toString(), Toast.LENGTH_SHORT).show(); 
     } 
Смежные вопросы