【问题标题】:How do I populate an Android spinner using a JSON web service?如何使用 JSON Web 服务填充 Android 微调器?
【发布时间】:2012-10-06 01:54:41
【问题描述】:

如何解析如下所示的包含学校名称和 ID 的 JSON 文件,并使用“名称”字段中的值填充微调器标签?

我希望微调器将选定的 SchoolID 输出到下一个活动。例如。因此,您会看到“Hill View Elementary”,如果您选择此选项,则值“HVE”将输出到下一个要执行的活动。

{
"schools": [
{
"Name": "Hill View Elementary",
"SchoolID": "HVE"},
{
"Name": "Mill View",
"SchoolID": "MVE"},
{
"Name": "Big School",
"SchoolID": "BSC"},
]
}

这是我用来尝试读取提要的 onCreate...

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);  

    String readFeed = readFeed();
    try {
      JSONArray jsonArray = new
      JSONArray(readFeed);
      Log.i(MainActivity.class.getName(),
          "Number of entries " + jsonArray.length());

      for (int i = 0; i < jsonArray.length(); i++) {
        JSONObject jsonObject = jsonArray.getJSONObject(i);

        // Here instead of Logging I want to use each schools "Name" to 
        // be put into an array that I can use to populate the strings 
        // for the spinner

        Log.i(MainActivity.class.getName(), jsonObject.getString("schools"));

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

我仍然在 Android 上快速上手,因此非常感谢。

这里是阅读提要:

public String readFeed() {
    StringBuilder builder = new StringBuilder();
    HttpClient client = new DefaultHttpClient();

    // domain intentionally obfuscated for security reasons
    HttpGet httpGet = new HttpGet("http://www.domain.com/schools.php");
    try 
 {
      HttpResponse response = client.execute(httpGet);
      StatusLine statusLine = response.getStatusLine();
      int statusCode = statusLine.getStatusCode();
      if (statusCode == 200) {
        HttpEntity entity = response.getEntity();
        InputStream content = entity.getContent();
        BufferedReader reader = new BufferedReader(new InputStreamReader(content));
        String
 line;
        while ((line = reader.readLine()) != null) {
          builder.append(line);
        }
      } else {
        Log.e(MainActivity.class.toString(), "Failed to download file");
      }
    } catch (ClientProtocolException e) {
      e.printStackTrace();
    } catch (IOException e)
 {
      e.printStackTrace();
    }
    return builder.toString();
  }

【问题讨论】:

    标签: android arrays json spinner


    【解决方案1】:

    我会这样做:

    public class School {
        private String name;
        private String id;
    
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        public String getId() {
            return id;
        }
        public void setId(String id) {
            this.id = id;
        }
    }
    

    创建时:

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);  
    
        String readFeed = readFeed();
    
        // you can use this array to find the school ID based on name
        ArrayList<School> schools = new ArrayList<School>();
        // you can use this array to populate your spinner
        ArrayList<String> schoolNames = new ArrayList<String>();
    
        try {
          JSONObject json = new JSONObject(readFeed);
          JSONArray jsonArray = new JSONArray(json.optString("schools"));
          Log.i(MainActivity.class.getName(),
              "Number of entries " + jsonArray.length());
    
          for (int i = 0; i < jsonArray.length(); i++) {
            JSONObject jsonObject = jsonArray.getJSONObject(i);
    
            School school = new School();
            school.setName(jsonObject.optString("Name"));
            school.setId(jsonObject.optString("SchoolID"));
            schools.add(school);
            schoolNames.add(jsonObject.optString("Name"));
    
          }
        } catch (Exception e) {
          e.printStackTrace();
        }
        Spinner mySpinner = (Spinner)findViewById(R.id.my_spinner);
        mySpinner.setAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_spinner_dropdown_item, schoolNames));
    }
    

    在您的 main_activity.xml 中,您需要一个 Spinner。上面的代码可以使用如下命名的 Spinner:

    <Spinner
        android:id="@+id/my_spinner"
        android:layout_height="wrap_content"
        android:layout_width="wrap_content"/>
    

    【讨论】:

    • 看起来不错,但我收到错误“对于 jsonObject 类型的方法 optValue(String) 未定义”。 (我正在为 2.3.3 编译)。
    • 抱歉,应该是optString()。立即尝试。
    • 这有帮助。我应该在 activity_main.xml 中声明:android:entries="@array/schools"(如何让微调器使用填充的数组?)
    • OK 这编译(好东西!)。但我的微调器仍然是空的。所以要么我的提要不正确(适用于等效的 iPhone 应用程序并通过 JSONlint),要么我的 readFeed 不工作。有没有办法检查我的提要是否被正确摄取到 jsonArray 中? (提示我在 LogCat 中没有看到“条目数”)。
    • 你能告诉我如何在用户选择名字后获取与学校名称关联的schoolID???
    猜你喜欢
    • 1970-01-01
    • 2017-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多