【问题标题】:How to get API data in Android如何在 Android 中获取 API 数据
【发布时间】:2021-01-20 16:55:33
【问题描述】:

我设法在我的活动中进行 API 调用,它确实在 logcat 中向我显示 API 结果,但我不知道如何在我的视图中显示这些数据?

Sample data

注意:数据在data数组下。

{
  "data": [
    {
      "id": "0ade1bfb-6d02-4a1f-9cd4-dc88fa8aadbd",
      "name": "a",
      "photo": null
    },
    {
      "id": "30a18b38-c563-4b3a-8c7d-af483c616e49",
      "name": "b",
      "photo": null
    },
    {
      "id": "709804f8-e429-4c9d-b5cd-2cf3b2add98c",
      "name": "c",
      "photo": null
    },
    {
      "id": "be204e7b-f1ab-45bc-a842-3d5f3f033381",
      "name": "d",
      "photo": null
    },
    {
      "id": "cafd632d-d9ba-4617-8823-abc145a95e9c",
      "name": "e",
      "photo": null
    }
  ],
  "message": "Data are ready."
}

Activity

private val client = OkHttpClient()

override fun onCreate(savedInstanceState: Bundle?) {
   //....
   run("api_link")
}

fun run(url: String) {
  val request = Request.Builder()
    .url(url)
    .build()

  client.newCall(request).enqueue(object : Callback {
    override fun onFailure(call: Call, e: IOException) {}
    override fun onResponse(call: Call, response: Response) {
      Log.d("results: ", response.body()!!.string()) // does return the data

      // returning data in view?

    }
  })
}

Question

  1. 如何定义显示返回数据的元素?
  2. 如何循环这些数据? (如果返回的数据是对象呢?比如通过 id 获取帖子

更新

我对我的代码进行了一些更改,现在我收到了org.json.JSONException: No value for services

code

fun run(url: String) {
        val request = Request.Builder()
            .url(url)
            .build()

        client.newCall(request).enqueue(object : Callback {
            override fun onFailure(call: Call, e: IOException) {}
            override fun onResponse(call: Call, response: Response) {


                // added this part
                val list: ArrayList<Service> = ArrayList()
                getServices(response.body()!!.string(), list)
                //


                Log.d("results: ", response.body()!!.string())

                // Getting view element
                val textView: TextView = findViewById(R.id.recycler)
                textView.text = list.toString()
            }
        })
    }

fun getServices(response: String, list: ArrayList<Service>) { //service class
    var jsonObject = JSONObject(response)
    val jsonArray = jsonObject.getJSONArray("services")

    for (i in 0 until jsonArray.length()) {
        val jsonObject1 = jsonArray.getJSONObject(i)
        var listingObject = Service( //service class
            jsonObject1.getInt("id"),
            jsonObject1.getString("name"),
            jsonObject1.getString("image")
        )
        list.add(listingObject)
    }
}

然后我添加了如下服务类:

class Service ( val id: Int, val name: String?, val image: String?) {
}

有什么想法吗?

【问题讨论】:

  • @a_local_nobody 我不这么认为,不
  • @mafortis 尝试在解析更简单的地方使用改造
  • @rcs 我也安装了它,但从未提出过请求,所以我不知道该怎么做?
  • 官方文档是从square.github.io/retrofit开始的好地方

标签: android kotlin


【解决方案1】:

嗯,从 API 接收数据并在您的 UI 上显示数据之间有一些步骤。

你想如何展示它?填充回收站视图?在吐司中显示一些信息?在一些editText中显示?

您需要将 JSON 解析为某个对象,比如说对象“Data”,其中包含字段“id”、“name”和“photo”。

解析之后,由于你已经在你的活动中,你可以在你的视图中显示它。

您需要获取对您的视图的引用并显示它。

如果你有一个编辑文本,你可以通过调用来显示它:

  (your editText Reference).setText(data.name)

【讨论】:

  • 我已经更新了我的问题(包括你的建议)你介意检查一下吗?
  • @mafortis 我建议你的“getServices”方法返回arrayList,所以你可以写list = getServices(...)。由于您的列表中有多个服务,因此您无法在一个 editText 中显示所有内容。您可以通过以下方式测试您的代码:textView.text = list[0].toString()。关于 JSON 错误,您可以在这里找到更多信息:stackoverflow.com/questions/15477304/…
  • 不,别弄错了,这些名称是我所做的许多更改中保留的:D 我实际上尝试使用 recycleview findViewById(R.id.recycler) 我的目的是显示所有项目的列表。
猜你喜欢
  • 1970-01-01
  • 2022-01-10
  • 2022-01-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-10
  • 2012-08-17
相关资源
最近更新 更多