Commit 33655ac7 authored by yinjiacheng's avatar yinjiacheng

update 订单详情页UI

parent df147c92
package com.yidian.shenghuoquan.border.adapter
import android.graphics.Rect
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.databinding.DataBindingUtil
import androidx.recyclerview.widget.RecyclerView
import com.yidian.shenghuoquan.border.R
import com.yidian.shenghuoquan.border.databinding.BorderItemOrderDetailCommodityListBinding
import com.yidian.shenghuoquan.border.dto.OrderItem
import com.yidian.shenghuoquan.border.viewmodel.OrderDetailCommodityListItemViewModel
import com.yidian.utils.DensityUtil
/**
* author: yinjiacheng
* date: 2021/8/23 16:18
* description: 订单详情商品列表
*/
class OrderDetailCommodityListAdapter(data: List<OrderItem>?) :
RecyclerView.Adapter<OrderDetailCommodityListAdapter.OrderDetailCommodityListViewHolder>() {
private val data by lazy { ArrayList<OrderItem>() }
init {
data?.let {
this.data.addAll(it)
}
}
/**
* 更新数据
*/
fun updateData(data: List<OrderItem>?) {
data?.let {
notifyItemRangeRemoved(0, this.data.size)
this.data.clear()
this.data.addAll(it)
notifyItemRangeInserted(0, this.data.size)
}
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): OrderDetailCommodityListViewHolder {
val binding = DataBindingUtil.inflate<BorderItemOrderDetailCommodityListBinding>(
LayoutInflater.from(parent.context),
R.layout.border_item_order_detail_commodity_list,
parent,
false
)
return OrderDetailCommodityListViewHolder(binding.root, binding)
}
override fun onBindViewHolder(holder: OrderDetailCommodityListViewHolder, position: Int) {
holder.binding.vm = OrderDetailCommodityListItemViewModel()
holder.binding.data = data[position]
}
override fun getItemCount(): Int {
return data.size
}
class OrderDetailCommodityListViewHolder(itemView: View, val binding: BorderItemOrderDetailCommodityListBinding) :
RecyclerView.ViewHolder(itemView)
class OrderDetailCommodityListItemDecoration : RecyclerView.ItemDecoration() {
override fun getItemOffsets(outRect: Rect, view: View, parent: RecyclerView, state: RecyclerView.State) {
outRect.top = DensityUtil.dp2px(16f)
}
}
}
...@@ -22,11 +22,11 @@ data class OrderDetailDto( ...@@ -22,11 +22,11 @@ data class OrderDetailDto(
@SerializedName("comment") @SerializedName("comment")
val comment: String, val comment: String,
@SerializedName("coupon_list") @SerializedName("coupon_list")
val couponList: List<Any>, val couponList: List<Coupon>,
@SerializedName("create_time") @SerializedName("create_time")
val createTime: String, val createTime: String,
@SerializedName("discount_fee") @SerializedName("discount_fee")
val discountFee: String, val discountFee: Double,
@SerializedName("is_refund") @SerializedName("is_refund")
val isRefund: Int, val isRefund: Int,
@SerializedName("life_account_icon") @SerializedName("life_account_icon")
...@@ -74,10 +74,10 @@ data class OrderDetailDto( ...@@ -74,10 +74,10 @@ data class OrderDetailDto(
@SerializedName("shop_id") @SerializedName("shop_id")
val shopId: String, val shopId: String,
@SerializedName("total_price") @SerializedName("total_price")
val totalPrice: Int, val totalPrice: Double,
@SerializedName("update_time") @SerializedName("update_time")
val updateTime: String, val updateTime: String,
@SerializedName("use_coupon") @SerializedName("use_coupon") // 是否使用优惠券,0未使用,1使用
val useCoupon: Int, val useCoupon: Int,
@SerializedName("user_id") @SerializedName("user_id")
val userId: Long, val userId: Long,
...@@ -85,6 +85,31 @@ data class OrderDetailDto( ...@@ -85,6 +85,31 @@ data class OrderDetailDto(
val wechat: Wechat val wechat: Wechat
) )
data class Coupon(
@SerializedName("coupon_amount")
val couponAmount: Int,
@SerializedName("coupon_id")
val couponId: String,
@SerializedName("create_time")
val createTime: String,
@SerializedName("goods_sku_id")
val goodsSkuId: String,
@SerializedName("order_id")
val orderId: String,
@SerializedName("order_item_id")
val orderItemId: String,
@SerializedName("recover_coupon_amount")
val recoverCouponAmount: Int,
@SerializedName("share_coupon_amount")
val shareCouponAmount: Int,
@SerializedName("share_coupon_id")
val shareCouponId: Int,
@SerializedName("update_time")
val updateTime: String,
@SerializedName("user_id")
val userId: Long
)
data class MergeOrderItem( data class MergeOrderItem(
@SerializedName("desc_pic_url") @SerializedName("desc_pic_url")
val descPicUrl: String, val descPicUrl: String,
...@@ -93,7 +118,7 @@ data class MergeOrderItem( ...@@ -93,7 +118,7 @@ data class MergeOrderItem(
@SerializedName("goods_num") @SerializedName("goods_num")
val goodsNum: Int, val goodsNum: Int,
@SerializedName("price") @SerializedName("price")
val price: Int val price: Double
) )
data class OrderItem( data class OrderItem(
...@@ -136,7 +161,7 @@ data class OrderItem( ...@@ -136,7 +161,7 @@ data class OrderItem(
@SerializedName("payment") @SerializedName("payment")
val payment: Int, val payment: Int,
@SerializedName("price") @SerializedName("price")
val price: Int, val price: Double,
@SerializedName("refund_amount") @SerializedName("refund_amount")
val refundAmount: Int, val refundAmount: Int,
@SerializedName("refund_count") @SerializedName("refund_count")
......
...@@ -27,6 +27,7 @@ class OrderDetailActivity : BaseMvvmActivity<BorderActivityOrderDetailBinding, O ...@@ -27,6 +27,7 @@ class OrderDetailActivity : BaseMvvmActivity<BorderActivityOrderDetailBinding, O
binding.ivCommodityInfo.setCommodityInfo(status, it) binding.ivCommodityInfo.setCommodityInfo(status, it)
binding.ivOrderInfo.setOrderInfo(status, it) binding.ivOrderInfo.setOrderInfo(status, it)
}) })
vm.requestOrderDetail("21081915562568101010") // Test
vm.requestOrderDetail("21082017225320101002")
} }
} }
...@@ -5,10 +5,13 @@ import android.util.AttributeSet ...@@ -5,10 +5,13 @@ import android.util.AttributeSet
import android.view.LayoutInflater import android.view.LayoutInflater
import androidx.constraintlayout.widget.ConstraintLayout import androidx.constraintlayout.widget.ConstraintLayout
import androidx.databinding.DataBindingUtil import androidx.databinding.DataBindingUtil
import androidx.recyclerview.widget.LinearLayoutManager
import com.yidian.shenghuoquan.border.R import com.yidian.shenghuoquan.border.R
import com.yidian.shenghuoquan.border.adapter.OrderDetailCommodityListAdapter
import com.yidian.shenghuoquan.border.databinding.BorderViewOrderCommodityInfoBinding import com.yidian.shenghuoquan.border.databinding.BorderViewOrderCommodityInfoBinding
import com.yidian.shenghuoquan.border.dto.OrderDetailDto import com.yidian.shenghuoquan.border.dto.OrderDetailDto
import com.yidian.shenghuoquan.border.manager.OrderStatus import com.yidian.shenghuoquan.border.manager.OrderStatus
import com.yidian.shenghuoquan.border.viewmodel.OrderCommodityInfoViewModel
/** /**
* author: yinjiacheng * author: yinjiacheng
...@@ -25,6 +28,17 @@ class OrderCommodityInfoView @JvmOverloads constructor(context: Context, attrs: ...@@ -25,6 +28,17 @@ class OrderCommodityInfoView @JvmOverloads constructor(context: Context, attrs:
this, this,
true true
) )
private val adapter by lazy { OrderDetailCommodityListAdapter(null) }
init {
initRecycleView()
}
private fun initRecycleView() {
binding.rvCommodityList.layoutManager = LinearLayoutManager(context, LinearLayoutManager.VERTICAL, false)
binding.rvCommodityList.adapter = adapter
binding.rvCommodityList.addItemDecoration(OrderDetailCommodityListAdapter.OrderDetailCommodityListItemDecoration())
}
/** /**
* 设置商品信息 * 设置商品信息
...@@ -32,6 +46,9 @@ class OrderCommodityInfoView @JvmOverloads constructor(context: Context, attrs: ...@@ -32,6 +46,9 @@ class OrderCommodityInfoView @JvmOverloads constructor(context: Context, attrs:
* @param info 商品信息 * @param info 商品信息
*/ */
fun setCommodityInfo(status: OrderStatus, info: OrderDetailDto) { fun setCommodityInfo(status: OrderStatus, info: OrderDetailDto) {
binding.vm = OrderCommodityInfoViewModel()
binding.status = status
binding.data = info
adapter.updateData(info.orderItemList)
} }
} }
package com.yidian.shenghuoquan.border.viewmodel
import android.widget.ImageView
import androidx.databinding.BindingAdapter
import com.bumptech.glide.Glide
import com.bumptech.glide.load.resource.bitmap.CenterCrop
import com.bumptech.glide.load.resource.bitmap.RoundedCorners
import com.bumptech.glide.request.RequestOptions
import com.yidian.bcommon.mvvm.BaseViewModel
import com.yidian.shenghuoquan.border.R
import com.yidian.utils.DensityUtil
/**
* author: yinjiacheng
* date: 2021/8/23 16:01
* description: 订单详情商品列表
*/
class OrderDetailCommodityListItemViewModel : BaseViewModel() {
companion object {
/**
* 加载商品图片
* @param url 图片url
* @param target 目标ImageView
*/
@BindingAdapter("commodityImageUrl")
@JvmStatic
fun loadCommodityImage(target: ImageView, url: String) {
Glide.with(target.context).load(url)
.apply(
RequestOptions()
.transform(CenterCrop(), RoundedCorners(DensityUtil.dp2px(12F)))
.error(R.drawable.img_order_commodity_placeholder)
.placeholder(R.drawable.img_order_commodity_placeholder)
)
.into(target)
}
}
}
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools">
<data>
<variable
name="vm"
type="com.yidian.shenghuoquan.border.viewmodel.OrderDetailCommodityListItemViewModel" />
<variable
name="data"
type="com.yidian.shenghuoquan.border.dto.OrderItem" />
</data>
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<ImageView
android:id="@+id/iv_commodity_pic"
android:layout_width="@dimen/dp82"
android:layout_height="@dimen/dp60"
app:commodityImageUrl="@{data.descPicUrl}"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
tools:src="@drawable/img_order_commodity_placeholder" />
<TextView
android:id="@+id/tv_commodity_name"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/dp8"
android:ellipsize="end"
android:includeFontPadding="false"
android:maxLines="1"
android:text="@{data.goodsName}"
android:textColor="@color/color_333333"
android:textSize="@dimen/sp15"
app:layout_constraintStart_toEndOf="@id/iv_commodity_pic"
app:layout_constraintTop_toTopOf="parent"
tools:text="肉末茄子+蔬蒸蛋套餐+肉末茄…" />
<TextView
android:id="@+id/tv_commodity_count"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/dp8"
android:includeFontPadding="false"
android:text="@{'共' + String.valueOf(data.goodsNum) + '件'}"
android:textColor="@color/color_999999"
android:textSize="@dimen/sp13"
app:layout_constraintStart_toStartOf="@id/tv_commodity_name"
app:layout_constraintTop_toBottomOf="@id/tv_commodity_name"
tools:text="共2件" />
<TextView
android:id="@+id/tv_commodity_amount"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/dp8"
android:includeFontPadding="false"
android:text="@{'¥' + String.valueOf(data.price)}"
android:textColor="@color/color_333333"
android:textSize="@dimen/sp16"
android:textStyle="bold"
app:layout_constraintStart_toStartOf="@id/tv_commodity_name"
app:layout_constraintTop_toBottomOf="@id/tv_commodity_count"
tools:text="¥15.00" />
</androidx.constraintlayout.widget.ConstraintLayout>
</layout>
\ No newline at end of file
...@@ -5,6 +5,23 @@ ...@@ -5,6 +5,23 @@
<data> <data>
<import type="android.view.View" />
<import type="com.yidian.shenghuoquan.border.manager.OrderStatus" />
<import type="java.util.List" />
<variable
name="vm"
type="com.yidian.shenghuoquan.border.viewmodel.OrderCommodityInfoViewModel" />
<variable
name="status"
type="com.yidian.shenghuoquan.border.manager.OrderStatus" />
<variable
name="data"
type="com.yidian.shenghuoquan.border.dto.OrderDetailDto" />
</data> </data>
<androidx.constraintlayout.widget.ConstraintLayout <androidx.constraintlayout.widget.ConstraintLayout
...@@ -20,6 +37,7 @@ ...@@ -20,6 +37,7 @@
android:id="@+id/tv_activity_title" android:id="@+id/tv_activity_title"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:text="@{data.marketingName}"
android:textColor="@color/color_333333" android:textColor="@color/color_333333"
android:textSize="@dimen/sp16" android:textSize="@dimen/sp16"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
...@@ -54,6 +72,7 @@ ...@@ -54,6 +72,7 @@
android:text="@string/apply_refund" android:text="@string/apply_refund"
android:textColor="@color/color_999999" android:textColor="@color/color_999999"
android:textSize="@dimen/sp11" android:textSize="@dimen/sp11"
android:visibility="@{status == OrderStatus.ORDER_STATUS_PAID ? View.VISIBLE : View.GONE}"
app:layout_constraintEnd_toStartOf="@id/tv_contract_seller" app:layout_constraintEnd_toStartOf="@id/tv_contract_seller"
app:layout_constraintTop_toTopOf="@id/tv_contract_seller" /> app:layout_constraintTop_toTopOf="@id/tv_contract_seller" />
...@@ -89,19 +108,19 @@ ...@@ -89,19 +108,19 @@
android:layout_marginStart="@dimen/dp3" android:layout_marginStart="@dimen/dp3"
android:ellipsize="end" android:ellipsize="end"
android:maxLines="1" android:maxLines="1"
android:text="@string/red_packet_or_coupon"
android:textColor="@color/color_333333" android:textColor="@color/color_333333"
android:textSize="@dimen/sp14" android:textSize="@dimen/sp14"
app:layout_constraintBottom_toBottomOf="@id/iv_coupon" app:layout_constraintBottom_toBottomOf="@id/iv_coupon"
app:layout_constraintEnd_toStartOf="@id/tv_coupon_amount" app:layout_constraintEnd_toStartOf="@id/tv_coupon_amount"
app:layout_constraintStart_toEndOf="@id/iv_coupon" app:layout_constraintStart_toEndOf="@id/iv_coupon"
app:layout_constraintTop_toTopOf="@id/iv_coupon" /> app:layout_constraintTop_toTopOf="@id/iv_coupon"
tools:text="@string/red_packet_or_coupon" />
<TextView <TextView
android:id="@+id/tv_coupon_amount" android:id="@+id/tv_coupon_amount"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:background="@drawable/shape_solid_d66948_corner_9"
android:drawableEnd="@drawable/icon_next_white" android:drawableEnd="@drawable/icon_next_white"
android:paddingStart="@dimen/dp8" android:paddingStart="@dimen/dp8"
android:paddingTop="@dimen/dp2" android:paddingTop="@dimen/dp2"
...@@ -122,6 +141,7 @@ ...@@ -122,6 +141,7 @@
android:text="@string/discount_amount" android:text="@string/discount_amount"
android:textColor="@color/color_333333" android:textColor="@color/color_333333"
android:textSize="@dimen/sp14" android:textSize="@dimen/sp14"
android:visibility="@{data.useCoupon == 1 ? View.VISIBLE : View.GONE}"
app:layout_constraintBaseline_toBaselineOf="@id/tv_total_amount" app:layout_constraintBaseline_toBaselineOf="@id/tv_total_amount"
app:layout_constraintEnd_toStartOf="@id/tv_discount_amount" /> app:layout_constraintEnd_toStartOf="@id/tv_discount_amount" />
...@@ -130,8 +150,10 @@ ...@@ -130,8 +150,10 @@
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginEnd="@dimen/dp8" android:layout_marginEnd="@dimen/dp8"
android:text="@{'¥' + String.valueOf(data.discountFee)}"
android:textColor="@color/color_D66948" android:textColor="@color/color_D66948"
android:textSize="@dimen/sp14" android:textSize="@dimen/sp14"
android:visibility="@{data.useCoupon == 1 ? View.VISIBLE : View.GONE}"
app:layout_constraintBaseline_toBaselineOf="@id/tv_total_amount" app:layout_constraintBaseline_toBaselineOf="@id/tv_total_amount"
app:layout_constraintEnd_toStartOf="@id/tv_total_amount_text" app:layout_constraintEnd_toStartOf="@id/tv_total_amount_text"
tools:text="¥10.00" /> tools:text="¥10.00" />
...@@ -151,6 +173,7 @@ ...@@ -151,6 +173,7 @@
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginTop="@dimen/dp24" android:layout_marginTop="@dimen/dp24"
android:text="@{'¥' + String.valueOf(data.totalPrice)}"
android:textColor="@color/black" android:textColor="@color/black"
android:textSize="@dimen/sp18" android:textSize="@dimen/sp18"
android:textStyle="bold" android:textStyle="bold"
......
...@@ -161,7 +161,7 @@ ...@@ -161,7 +161,7 @@
android:layout_width="0dp" android:layout_width="0dp"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginStart="@dimen/dp14" android:layout_marginStart="@dimen/dp14"
android:text="@{data.marketingName}" android:text="@{data.comment}"
android:textColor="@color/color_333333" android:textColor="@color/color_333333"
android:textSize="@dimen/sp14" android:textSize="@dimen/sp14"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment