【问题标题】:Import data from JSON or XML feed and create a List in Android从 JSON 或 XML 提要导入数据并在 Android 中创建列表
【发布时间】:2017-04-10 14:39:43
【问题描述】:

我正在尝试创建一个 Android 类来创建其他应用程序的列表,以便稍后显示,直到现在我有以下代码用于创建列表(取自谷歌示例):

public final class AppList {

public static List<App> list;

public static List<App> setupApp() {
    list.add(buildAppInfo(
            "Browsers",
            "chrome",
            "description",
            "Google Inc.",
            "com.android.chrome",
            "http://...",
            "http://..."
    ));
    list.add(buildAppInfo(
            "Browsers",
            "Firefox",
            "description",
            "Mozilla",
            "com.mozilla.firefox",
            "http://...",
            "http://..."
    ));
    [An so on...]

    return list;
}

private static App buildAppInfo(String category,
                                    String title,
                                    String description,
                                    String developer,
                                    String packageName,
                                    String iconImageUrl,
                                    String bgImageUrl) {
    App app = new App();
    app.setId(App.getCount());
    App.incCount();
    app.setTitle(title);
    app.setDescription(description);
    app.setDeveloper(developer);
    app.setCategory(category);
    app.setIconImageUrl(iconImageUrl);
    app.setBackgroundImageUrl(bgImageUrl);
    app.setPackageName(packageName);
    return app;
    }
}
//From here everything is handled in other activity

我希望从 Web 服务器动态加载详细信息,我可以将其设置为提供 JSONArray 或 XML,然后将该数据放在列表中。对于我正在阅读的内容,我可以使用 Volley,但总的来说,我在 Volley 或 Java 方面不是很有经验(我只是在学习中),所以我对如何继续没有太多想法。

我从谷歌开发者网站找到了example。我正在考虑添加这样的内容:

public final class AppList {

public static List<App> list;

public static List<App> setupApp() {
    /*Json Request*/
    String url = "https://json_url/";
    JsonObjectRequest jsonObjectRequest = new JsonObjectRequest( Request.Method.GET, url, null,
            new Response.Listener<JSONObject>() {
                @Override
                public void onResponse(JSONObject response) {
                    list.add(response);//ADD ITEMS TO LIST HERE
                }
            },
            new Response.ErrorListener() {
                @Override
                public void onErrorResponse(VolleyError error) {

                }
            });

    return list;
}

private static App buildAppInfo(String category,
                                    String title,
                                    String description,
                                    String developer,
                                    String packageName,
                                    String iconImageUrl,
                                    String bgImageUrl) {
    App app = new App();
    app.setId(App.getCount());
    App.incCount();
    app.setTitle(title);
    app.setDescription(description);
    app.setDeveloper(developer);
    app.setCategory(category);
    app.setIconImageUrl(iconImageUrl);
    app.setBackgroundImageUrl(bgImageUrl);
    app.setPackageName(packageName);
    return app;
    }
}

从服务器提要收到的数据应该是这样的:

buildAppInfo(
            "Browsers",
            "Firefox",
            "description",
            "Mozilla",
            "com.mozilla.firefox",
            "http://...",
            "http://..."
    )
buildAppInfo(
            "Browsers",
            "Firefox",
            "description",
            "Mozilla",
            "com.mozilla.firefox",
            "http://...",
            "http://..."
    )
[...]
//BUT IN JSON FORMAT

我的整个方法显然行不通。有人可以帮我实现我需要的吗?谢谢。

【问题讨论】:

  • 你必须把那个JsonObject转换成数组格式,比如ContentValues,hashMap,然后把那个数组给你的listview,直接JsonObject是不行的。

标签: java android json xml android-volley


【解决方案1】:

您想要做的最简单的设置需要:

一种从 URL 读取内容、解析接​​收到的 JSON 数组的方法。比如变成JSONArray or JSONObject(你可以在mvnrepository上获取):

public static JSONArray parseJsonFromUrl(String uri) throws IOException, JSONException {
    JSONArray array = null;
    try (Scanner sn = new Scanner(new URL(uri).openStream(), "UTF-8")){
      array = new JSONArray(sn.useDelimiter("\\A").next());
    }
    return array;
}

将接收到的信息映射到特定App对象的List,例如:

public static List<App> getAppList(JSONArray array){
    List<App> appList = new ArrayList<>();
    for (int i = 0; i < array.length(); i++) {
            JSONObject object = array.getJSONObject(i);
            appList.add(buildAppInfo(object.getString("category"), object.getString("title"), object.getString("description"), object.getString("developer"), object.getString("packageName"), object.getString("iconImageUrl"), object.getString("bgImageUrl")));
    }
    return appList;
}

使用 XML 的方法与此类似,改为使用 XML 解析器(详情请查看 How to read XML response from a URL in java?)。

您可以使用更高级的工具,例如 Jackson MapperSpring RestTemplate 来使用 RESTful 服务,但我建议您从这种简单的方法开始,直到您更加熟悉 Java 生态系统。

[更新]

我使用此答案的代码创建了一个quick demo,以便您对其进行修改。您还可以将其用作样板,以使用 Spring Boot 构建所需的其余服务。 (查看https://elcodedocle-jsontest.herokuapp.com/apps 了解最新通过的 travisCI 服务构建的实时部署)

[ANOTHER_UPDATE]

如果您仍然一无所知,这里是一个完整的 Android 应用程序消耗一个列表(“应用程序”json 对象的 json 数组)提供通过 RESTful 服务,使用写在这个答案上的代码来自一个 android 应用程序(是的,你可以将这个作为一个功能齐全的 android studio 项目导入):https://github.com/elcodedocle/android-resttest

请记住,这是一个基本示例,使用了我能为初学者想出的最简单的方法。如果您在 Java 生态系统中继续编码一段时间,您会发现更高级的工具,您可能会发现这些工具更适合您的项目,只要您有足够的经验能够理解它们的正确用法。

【讨论】:

  • 如果您的 GitHub 示例代码可以导入到 Android Studio 中,将会非常棒。
  • 您可以将其作为 maven java 项目导入 IntelliJ 的标准 java IDE 中。我不知道他们的 Android Studio 是否支持除 android 项目以外的任何东西(尝试从 git repo 寻找类似 import...maven 项目的东西)。如果不是,则将后端设置为 android 应用程序是没有意义的,但是您可以将 resttest 类作为在您的项目中使用它(唯一需要的依赖项是 org.json,您可以按照指定将其添加到您的 gradle 构建中在 mvnrepository 链接上
  • (jackson 和 slf4j 记录器也包含在 main 方法中,用于很好地输出处理后的列表,但您可以删除这些行并执行您真正想要对列表执行的操作)跨度>
  • 您仍然可以使用 maven 从命令行构建和运行此项目作为您的 android 应用程序的测试后端服务器(不需要花哨的 IDE,如果需要,只需编辑控制器类输出不同的东西,然后使用 maven cli 重新打包并重新启动服务,让它准备好被您的 android studio 项目应用程序使用)
  • 如果您想了解我的意思,请查看github.com/elcodedocle/android-resttest
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-03
相关资源
最近更新 更多