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
使用 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