Android Kotlin Retrofit 从 response.body() 中提取单个信息

Android Kotlin Retrofit Extract a single information from response.body()

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

邮递员中的响应如下所示:

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

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

这是我想展示它们的布局的片段代码(看起来像 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>

这是我使用的数据class:

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
)

这是布局片段中的代码片段:

    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() 中获取 OutstandingOrderDetailPOJODataClassHeader class 的实例,因此您可以以 response.body().data?.header.attributeName 的形式适当地访问 onResponse 中的数据在 TextViews 中设置。同样可以访问detail

为了访问响应的 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