2016-08-25 128 views
0

我对android相当新,我只用了两个月左右,所以请好好=)由于String []项目,我得到字符串结果的错误需要填充阵列适配器适配器。将json数组数据填充到android动态微调器中

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

而/ /完美的作品,但我不想哈编码数组。

+2

从我的理解你是下载JSON并且想要添加值到ArrayAdapter,但项目不是一个数组。你所要做的就是解析JSON响应。有一个不错的[阅读](http://crunchify.com/how-to-read-json-object-from-file-in-java/)。 – Abbas

+0

ArrayAdapters将接受数组和集合。我看到你传递了一个字符串,这是行不通的。 – SripadRaj

回答

1

假设你的JSON看起来是这样的:

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

与此帮助这个对象类:

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

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

你可以用这个代码,它解析到一个数组

虽然这不会直接与ArrayAdapter一起工作,但您需要一个自定义适配器才能将v或者只用subject_name值创建一个新数组。在其他评论中也提到,使用库来创建REST调用将简化代码并使其更具弹性。下面是使用凌空一个例子:

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

更新(添加异步HTTP库列表):

Volley是从谷歌

Retrofit从广场

社区提供

Android Aysnc - 打开来自詹姆斯史密斯的源码提供

+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(); 
     }