【问题标题】:Android Kotlin Retrofit Extract a single information from response.body()Android Kotlin Retrofit 从 response.body() 中提取单个信息
【发布时间】:2020-06-06 13:52:39
【问题描述】:

使用 Retrofit,我只是成功地从端点调用 GET 请求。它在response.body() 中返回正确的响应。在Logcat中,就像this

postman 中的响应如下所示:

现在我想从response.body 中提取Header 属性并将它们传递给一些文本视图。正如你在上面看到的,它是一个单一的对象。

互联网上所有关于如何使用改造的例子都是使用它来填充回收视图。至于这个,它是一个单一的对象,我不想在列表视图或回收器视图中显示它们。

这是我想要展示的布局的 sn-p 代码(看起来像 this):

<LinearLayout
   android:layout_width="wrap_content"
   android:layout_height="wrap_content"
   android:orientation="vertical"
   android:layout_marginStart="32dp"
   android:layout_marginTop="24dp">

                <TextView
                    android:id="@+id/detailOutletName"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="XXX"
                    android:textSize="16sp"
                    app:layout_constraintStart_toStartOf="parent"
                    app:layout_constraintTop_toTopOf="parent" />

                <TextView
                    android:id="@+id/detailOrderNumber"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_marginTop="16dp"
                    android:text="XXX"
                    android:textSize="16sp"
                    app:layout_constraintStart_toStartOf="parent"
                    app:layout_constraintTop_toBottomOf="@+id/textView3" />

                <TextView
                    android:id="@+id/detailOrderDateTime"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_marginTop="16dp"
                    android:text="XXX"
                    android:textSize="16sp"
                    app:layout_constraintStart_toStartOf="parent"
                    app:layout_constraintTop_toBottomOf="@+id/textView3" />

                <TextView
                    android:id="@+id/dtailOrderTotalPrice"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_marginTop="16dp"
                    android:text="XXX"
                    android:textSize="16sp"
                    app:layout_constraintStart_toStartOf="parent"
                    app:layout_constraintTop_toBottomOf="@+id/textView3" />
                <TextView
                    android:id="@+id/detailCustomerName"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_marginTop="16dp"
                    android:text="XXX"
                    android:textSize="16sp"
                    app:layout_constraintStart_toStartOf="parent"
                    app:layout_constraintTop_toBottomOf="@+id/textView3" />
                <TextView
                    android:id="@+id/detailCustomerAddress"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_marginTop="16dp"
                    android:text="XXX"
                    android:textSize="16sp"
                    app:layout_constraintStart_toStartOf="parent"
                    app:layout_constraintTop_toBottomOf="@+id/textView3" />

                <TextView
                    android:id="@+id/detailCustomerPhone"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_marginTop="16dp"
                    android:text="XXX"
                    android:textSize="16sp"
                    app:layout_constraintStart_toStartOf="parent"
                    app:layout_constraintTop_toBottomOf="@+id/textView3" />
            </LinearLayout>

这是我使用的数据类:

data class OutstandingOrderDetailPOJODataClass(

    @field:SerializedName("data")
    val data: OutstandingOrderDetailPOJODataClassData? = null,

    @field:SerializedName("error")
    val error: Error? = null
)

data class OutstandingOrderDetailPOJODataClassData(

    @field:SerializedName("Header")
    val header: OutstandingOrderDetailPOJODataClassHeader? = null,

    @field:SerializedName("Detail")
    val detail: List<OutstandingOrderDetailPOJODataClassDetailItem?>? = null
)

data class OutstandingOrderDetailPOJODataClassHeader(

    @field:SerializedName("buyer_address")
    val buyerAddress: String? = null,

    @field:SerializedName("total_price")
    val totalPrice: Int? = null,

    @field:SerializedName("buyer_name")
    val buyerName: String? = null,

    @field:SerializedName("status_confirmed_yn")
    val statusConfirmedYn: String? = null,

    @field:SerializedName("order_date")
    val orderDate: String? = null,

    @field:SerializedName("outlet_id")
    val outletId: String? = null,

    @field:SerializedName("nip")
    val nip: String? = null,

    @field:SerializedName("jumlah_product")
    val jumlahProduct: Int? = null,

    @field:SerializedName("last_update")
    val lastUpdate: String? = null,

    @field:SerializedName("phone_number")
    val phoneNumber: String? = null,

    @field:SerializedName("order_running_id")
    val orderRunningId: Int? = null,

    @field:SerializedName("status_tagged_yn")
    val statusTaggedYn: String? = null,

    @field:SerializedName("order_id")
    val orderId: String? = null
)

这是来自布局片段的代码 sn-p:

    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {

        val args = arguments?.let { OrderDetailFragmentArgs.fromBundle(it) }
        val selectedOrderId = args?.orderId

        // Change action bar title
        (activity as AppCompatActivity).supportActionBar?.title = "Order Details"


        // View Binding for this Fragment
        binding = DataBindingUtil.inflate(
            inflater,
            R.layout.fragment_order_detail, container, false
        )

        if (selectedOrderId != null) {
            fetchOrderDetail(selectedOrderId)
            fetchOrderedItemListData(selectedOrderId)
        }


        //Inflate layout to this activity fragment
        return binding.root
    }

    private fun fetchOrderDetail(selectedOrderId : String){
        NetworkConfig()
            .getOutstandingDetailService()
            .getOutstandingOrderDetail(selectedOrderId)
            .enqueue(object :
                Callback<OutstandingOrderDetailPOJODataClass>{
                override fun onFailure(
                    call: Call<OutstandingOrderDetailPOJODataClass>,
                    t: Throwable
                ) {
                    ....
                }

                override fun onResponse(
                    call: Call<OutstandingOrderDetailPOJODataClass>,
                    response: Response<OutstandingOrderDetailPOJODataClass>
                ) {
                    Log.i("Order", "Order Detail fetched! -> \n ${response.body()}") //This line is how the response.body() shown in the logcat.
                }
            })
    }

有没有办法做到这一点?如果有任何我想指出的细节,请随时询问。

【问题讨论】:

  • 在日志里面请像这样response.body().data?.header试试看
  • @satuser 所以我需要做的就是使用response.body().data?.header.attributeName 访问每个属性?
  • @satuser 它正在工作!非常感谢伙计。我建议您写下答案,以便将来对其他用户有所帮助。

标签: android kotlin retrofit


【解决方案1】:

要访问响应的Header 部分,您需要像response.body().data?.header 那样访问它,或者像下面那样进行访问

 val responseData = response.body().data

  //now you can get any values inside the data object as like below

val header = responseData?.header

val attributeName  = header?.attributeName 

【讨论】:

    【解决方案2】:

    日志显示您在response.body() 中获得了OutstandingOrderDetailPOJODataClassHeader 类的实例,因此您可以以response.body().data?.header.attributeName 的身份访问onResponse 中的数据,并在TextViews 中进行适当的设置。同样可以访问detail

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-07-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-15
      • 2019-11-14
      相关资源
      最近更新 更多