如何将 Json 字符串填充到 Android 微调器中

How to populate Json String into Android spinner

我的 Json 响应不是数组。它是单个 Json 对象(具有如下动态键和值对):

{
    "key1": "value1",
    "key2": "value2",
    "key3": "value3",
    "key4": "value4",
    "key5": "value5",
    "key6": "value6",
    "key7": "value7",
    "key8": "value8",
}

如何将值填充到 Android 微调器或如何根据此 Json 响应创建地图?

JsonObject json = new JsonObject(<yourresponse>);

解决方案

    Iterator<String> keys = json.keys();
    List<String> valueList = new ArrayList<String>();
    List<String> keyList = new ArrayList<String>();
    while( keys.hasNext() ){
        String key = (String)keys.next();
        String value = jObject.getString(key); 
        valueList.add(value);
        keyList.add(key);
    }

将键列表或值列表传递给 Spinner 的 ArrayAdapter

整个 JSON 响应可以读作 JSONObject,您可以遍历其元素并将字符串数据放入列表中。

    String jsonResponse = "{\n" +
            "    \"key1\": \"value1\",\n" +
            "    \"key2\": \"value2\",\n" +
            "    \"key3\": \"value3\",\n" +
            "    \"key4\": \"value4\",\n" +
            "    \"key5\": \"value5\",\n" +
            "    \"key6\": \"value6\",\n" +
            "    \"key7\": \"value7\",\n" +
            "    \"key8\": \"value8\"\n" +
            "}";

    ArrayList<String> spinnerList = new ArrayList<>();
    try {
        JSONObject root = new JSONObject(jsonResponse);

        for (int i = 1; i <= root.length(); i++) {
            String value = root.getString("key" + i);
            spinnerList.add(value);
        }

    } catch (JSONException e) {
        e.printStackTrace();
    }


    Spinner spinner = findViewById(R.id.spinner);
    ArrayAdapter<String> adapter = new ArrayAdapter<>(this, android.R.layout.simple_spinner_dropdown_item, spinnerList);
    spinner.setAdapter(adapter);

好的,我找到了解决方案。对于响应类型,我没有使用 JsonObject。我用了 HashMap<String, String>

     @GET("api")
 fun getListItems(
         @Header(NetworkUtils.CONTENT_TYPE) contentType: String = NetworkUtils.CONTENT_TYPE_PARAMS,
         @Header(NetworkUtils.AUTHORIZATION) bearerToken: String,
         @Query("language") language: String?
): Observable<Response<HashMap<String, String>>>

然后只需在 Spinner 上使用 HashMap

override fun populatesCaseTypesSpinner(response: HashMap<String, String>) {
     val adapter = ArrayAdapter(context!!, android.R.layout.simple_spinner_item, ArrayList(response.keys))

     adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item)

     spinnerCaseTypes.adapter = adapter

     spinnerCaseTypes.setOnTouchListener(View.OnTouchListener { _, _ ->
         hideKeyboard()
         false
     })

}