Commit ae789e9f authored by yinjiacheng's avatar yinjiacheng

add 商品管理功能

parent 8972a921
......@@ -90,6 +90,6 @@ dependencies {
exclude(group: 'com.yidian.android', module: 'NetworkImageLib')
}
implementation 'com.github.bumptech.glide:glide:4.11.0'
api 'com.github.bumptech.glide:glide:4.11.0'
kapt 'com.github.bumptech.glide:compiler:4.11.0'
}
\ No newline at end of file
......@@ -85,5 +85,8 @@ class XRouterPathConstants {
// 商品 —— 优惠券选择类目
const val chooseCategoryActivity = "/commodity/ChooseCategoryActivity"
// 商品 —— 商品管理
const val commodityManagement = "/commodity/CommodityManagement"
}
}
package com.yidian.common.widget
import android.content.Context
import android.util.AttributeSet
import android.view.View
import androidx.constraintlayout.widget.ConstraintLayout
import androidx.core.view.isVisible
import com.yidian.common.R
import com.yidian.common.databinding.ViewCommonTopBarBinding
import com.yidian.xpage.XPageManager
/**
* author: yinjiacheng
* date: 6/14/21 12:58 AM
* description: 顶部栏
*/
class CommonTopBarView @JvmOverloads constructor(
context: Context,
attrs: AttributeSet? = null,
defStyle: Int = 0
) : ConstraintLayout(context, attrs, defStyle), View.OnClickListener {
private val viewBinding by lazy {
ViewCommonTopBarBinding.bind(
View.inflate(
getContext(),
R.layout.view_common_top_bar,
this
)
)
}
/**
* 返回按钮点击回调
*/
private var backCallback: OnCommonTopBarBackCallback? = null
/**
* 操作按钮点击回调
*/
private var actionCallback: OnCommonTopBarActionCallback? = null
init {
val typeArray = context.obtainStyledAttributes(attrs, R.styleable.CommonTopBarView)
viewBinding.tvTitle.text =
typeArray.getText(R.styleable.CommonTopBarView_CommonTopBarView_title_text)
typeArray.getText(R.styleable.CommonTopBarView_CommonTopBarView_action_text)?.let {
if (it.isNotEmpty()) visibility = View.VISIBLE
viewBinding.tvAction.text = it
}
typeArray.recycle()
viewBinding.ivBack.setOnClickListener(this)
viewBinding.tvAction.setOnClickListener(this)
}
/**
* 设置返回按钮是否可见
*/
fun setBackVisibility(isVisible: Boolean) {
viewBinding.ivBack.isVisible = isVisible
}
/**
* 设置操作按钮是否可见
*/
fun setActionVisibility(isVisible: Boolean) {
viewBinding.tvAction.isVisible = isVisible
}
/**
* 设置操作按钮是否可用
*/
fun setActionEnable(isEnable: Boolean) {
viewBinding.tvAction.isEnabled = isEnable
viewBinding.tvAction.alpha = if (isEnable) 1f else 0.4f
}
override fun onClick(v: View?) {
if (v?.id == R.id.iv_back) {
// 若没有设置返回点击回调则默认pop
backCallback?.onDoBack() ?: XPageManager.pop(null)
} else if (v?.id == R.id.tv_action) {
actionCallback?.onDoAction()
}
}
/**
* 设置回调
* @param backCallback 返回按钮点击回调
* @param actionCallback 操作按钮点击回调
*/
fun setOnCommonTopBarCallback(backCallback: OnCommonTopBarBackCallback?, actionCallback: OnCommonTopBarActionCallback?) {
this.backCallback = backCallback
this.actionCallback = actionCallback
}
interface OnCommonTopBarActionCallback {
/**
* 操作按钮回调
*/
fun onDoAction()
}
interface OnCommonTopBarBackCallback {
/**
* 返回按钮回调
*/
fun onDoBack()
}
}
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<gradient
android:angle="0"
android:endColor="@color/color_3693FF"
android:startColor="@color/color_1751F1"
android:type="linear" />
<corners android:radius="@dimen/dp22" />
</shape>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<solid android:color="@color/white" />
<corners android:radius="@dimen/dp12" />
</shape>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="@dimen/dp44"
android:paddingStart="@dimen/dp20"
android:paddingEnd="@dimen/dp20">
<ImageView
android:id="@+id/iv_back"
android:layout_width="@dimen/dp28"
android:layout_height="@dimen/dp28"
android:src="@drawable/icon_back"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/tv_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:includeFontPadding="false"
android:textColor="@color/color_333333"
android:textSize="@dimen/sp18"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/tv_action"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:includeFontPadding="false"
android:textColor="@color/color_1852F1"
android:textSize="@dimen/sp14"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<resources>
<declare-styleable name="CommonTopBarView">
<attr name="CommonTopBarView_title_text" format="string" />
<attr name="CommonTopBarView_action_text" format="string" />
</declare-styleable>
</resources>
\ No newline at end of file
......@@ -45,4 +45,7 @@
<color name="color_1A000000">#1A000000</color>
<color name="color_DE000000">#DE000000</color>
<color name="color_8F000000">#8F000000</color>
<color name="color_F2F2F2">#F2F2F2</color>
<color name="color_3693FF">#3693FF</color>
<color name="color_1751F1">#1751F1</color>
</resources>
......@@ -7,5 +7,6 @@
<activity
android:name=".ui.coupon.CategorySearchActivity"
android:windowSoftInputMode="adjustPan" />
<activity android:name=".ui.coupon.CommodityManagementActivity" />
</application>
</manifest>
\ No newline at end of file
......@@ -3,6 +3,7 @@ package com.yidian.shenghuoquan.commodity.app
import com.yidian.common.XRouterPathConstants
import com.yidian.shenghuoquan.commodity.ui.coupon.ChooseCategoryActivity
import com.yidian.shenghuoquan.commodity.ui.coupon.PublishCouponsActivity
import com.yidian.shenghuoquan.commodity.ui.coupon.CommodityManagementActivity
/**
......@@ -13,6 +14,7 @@ object ClassMapUtil {
val xPageNodeMap = mapOf(
XRouterPathConstants.Companion.publishCouponsActivity to PublishCouponsActivity::class.java,// 发布优惠券
XRouterPathConstants.Companion.chooseCategoryActivity to ChooseCategoryActivity::class.java,// 优惠券选择类目
XRouterPathConstants.Companion.commodityManagement to CommodityManagementActivity::class.java, // 商品管理
)
}
package com.yidian.shenghuoquan.commodity.dto
import com.google.gson.annotations.SerializedName
/**
* author: yinjiacheng
* date: 7/2/21 4:20 PM
* description: 商品管理列表数据结构
*/
data class CommodityManagementListDto(
@SerializedName("goods_list")
val goodsList: List<Goods>,
@SerializedName("last_id")
val lastId: String,
@SerializedName("status_list")
val statusList: List<Status>
)
data class Goods(
@SerializedName("audit_status")
val auditStatus: Int,
@SerializedName("desc")
val desc: String,
@SerializedName("desc_pic_url")
val descPicUrl: String,
@SerializedName("desc_pic_url_list")
val descPicUrlList: List<String>,
@SerializedName("goods_name")
val goodsName: String,
@SerializedName("goods_sku_id")
val goodsSkuId: String,
@SerializedName("goods_spu_id")
val goodsSpuId: String,
@SerializedName("inventory_rest")
val inventoryRest: Int,
@SerializedName("online_status")
val onlineStatus: Int,
@SerializedName("original_price")
val originalPrice: Double,
@SerializedName("price")
val price: Double,
@SerializedName("total_amount_sold")
val totalAmountSold: Int
)
data class Status(
@SerializedName("name")
val name: String,
@SerializedName("type")
val type: String
)
package com.yidian.shenghuoquan.commodity.dto
import com.google.gson.annotations.SerializedName
/**
* author: yinjiacheng
* date: 7/6/21 10:46 AM
* description: 商品状态列表数据结构
*/
data class CommodityStatus(
@SerializedName("tab_id")
val tabId: Int,
@SerializedName("name")
val name: String,
@SerializedName("type")
val type: String
)
......@@ -6,7 +6,12 @@ import com.yidian.common.http.HttpResultSubscriber
import com.yidian.common.http.TransformUtil
import com.yidian.http.ServiceFactory
import com.yidian.shenghuoquan.commodity.dto.CategoryListDto
import com.yidian.shenghuoquan.commodity.dto.CommodityManagementListDto
import com.yidian.shenghuoquan.commodity.dto.CommodityStatus
import com.yidian.shenghuoquan.commodity.http.callback.ICategoryListCallback
import com.yidian.shenghuoquan.commodity.http.callback.ICommodityOperationCallback
import com.yidian.shenghuoquan.commodity.http.callback.IGetCommodityManagementListCallback
import com.yidian.shenghuoquan.commodity.http.callback.IGetCommodityStatusListCallback
/**
* 优惠券数据源
......@@ -34,4 +39,84 @@ object CouponDataSource {
}
})
}
/**
* 获取商品管理列表
*/
fun getCommodityManagementList(apiCallback: IGetCommodityManagementListCallback, requestParams: HashMap<String, String?>) {
val timeStamp = System.currentTimeMillis()
val publicParamsMap = HttpParamsUtils.getPublicParamsMap(timeStamp)
val privateParamsMap = HttpParamsUtils.getPrivateParamsMap(requestParams, timeStamp)
api.getCommodityManagementList(publicParamsMap, privateParamsMap)
.compose(TransformUtil.defaultSchedulers())
.subscribe(object : HttpResultSubscriber<CommodityManagementListDto>() {
override fun onSuccess(result: HttpResult<CommodityManagementListDto>?) {
apiCallback.getCommodityListSuccess(result?.result)
}
override fun onFailer(result: HttpResult<CommodityManagementListDto>?) {
apiCallback.getCommodityListFailure(result?.reason)
}
})
}
/**
* 获取商品状态列表
*/
fun getCommodityStatusList(apiCallback: IGetCommodityStatusListCallback) {
val timeStamp = System.currentTimeMillis()
val publicParamsMap = HttpParamsUtils.getPublicParamsMap(timeStamp)
val privateParamsMap = HttpParamsUtils.getPrivateParamsMap(hashMapOf(), timeStamp)
api.getCommodityStatusList(publicParamsMap, privateParamsMap)
.compose(TransformUtil.defaultSchedulers())
.subscribe(object : HttpResultSubscriber<ArrayList<CommodityStatus>>() {
override fun onSuccess(result: HttpResult<ArrayList<CommodityStatus>>?) {
apiCallback.getCommodityStatusListSuccess(result?.result)
}
override fun onFailer(result: HttpResult<ArrayList<CommodityStatus>>?) {
apiCallback.getCommodityStatusListFailure(result?.reason)
}
})
}
/**
* 商品上架
*/
fun commodityOnline(apiCallback: ICommodityOperationCallback, requestParams: HashMap<String, String?>) {
val timeStamp = System.currentTimeMillis()
val publicParamsMap = HttpParamsUtils.getPublicParamsMap(timeStamp)
val privateParamsMap = HttpParamsUtils.getPrivateParamsMap(requestParams, timeStamp)
api.commodityOnline(publicParamsMap, privateParamsMap)
.compose(TransformUtil.defaultSchedulers())
.subscribe(object : HttpResultSubscriber<Any>() {
override fun onSuccess(result: HttpResult<Any>?) {
apiCallback.commodityOnlineSuccess()
}
override fun onFailer(result: HttpResult<Any>?) {
apiCallback.commodityOnlineFailure(result?.reason)
}
})
}
/**
* 商品下架
*/
fun commodityOffline(apiCallback: ICommodityOperationCallback, requestParams: HashMap<String, String?>) {
val timeStamp = System.currentTimeMillis()
val publicParamsMap = HttpParamsUtils.getPublicParamsMap(timeStamp)
val privateParamsMap = HttpParamsUtils.getPrivateParamsMap(requestParams, timeStamp)
api.commodityOffline(publicParamsMap, privateParamsMap)
.compose(TransformUtil.defaultSchedulers())
.subscribe(object : HttpResultSubscriber<Any>() {
override fun onSuccess(result: HttpResult<Any>?) {
apiCallback.commodityOfflineSuccess()
}
override fun onFailer(result: HttpResult<Any>?) {
apiCallback.commodityOfflineFailure(result?.reason)
}
})
}
}
......@@ -3,6 +3,8 @@ package com.yidian.shenghuoquan.commodity.http
import com.yidian.common.http.HttpResult
import io.reactivex.rxjava3.core.Observable
import retrofit2.http.GET
import retrofit2.http.Headers
import retrofit2.http.POST
import retrofit2.http.QueryMap
interface CouponService {
......@@ -10,7 +12,10 @@ interface CouponService {
private companion object {
const val categoryList = "/goods/customer/get_goods_category_list"
const val searchCategoryList = "/merchant/enterprise/get_account_role_list"
const val getCommodityManagementList = "/goods/customer/my_goods"
const val getCommodityStatusList = "/goods/business/my_goods_status_list"
const val commodityOnline = "/goods/customer/online"
const val commodityOffline = "/goods/customer/offline"
}
/**
......@@ -18,9 +23,49 @@ interface CouponService {
*/
@GET(categoryList)
fun getCategoryList(@QueryMap commonParams: Map<String, String>, @QueryMap params: Map<String, String?>): Observable<HttpResult<Any?>>
/**
* 搜索类目列表(可能会共用上面的接口)
*/
@GET(searchCategoryList)
fun searchCategoryList(@QueryMap commonParams: Map<String, String>, @QueryMap params: Map<String, String?>): Observable<HttpResult<Any?>>
/**
* 1016 获取商品列表
*/
@GET(getCommodityManagementList)
fun getCommodityManagementList(
@QueryMap commonParams: Map<String, String>,
@QueryMap requestParams: Map<String, String?>
): Observable<HttpResult<Any?>>
/**
* 1025 获取商品状态列表
* e.g. 上架中,审核中,被驳回,已下架
*/
@GET(getCommodityStatusList)
fun getCommodityStatusList(
@QueryMap commonParams: Map<String, String>,
@QueryMap requestParams: Map<String, String?>
): Observable<HttpResult<Any?>>
/**
* 1012 商品上架
*/
@POST(commodityOnline)
@Headers("Content-Type: application/json")
fun commodityOnline(
@QueryMap commonParams: Map<String, String>,
@QueryMap requestParams: Map<String, String?>
): Observable<HttpResult<Any?>>
/**
* 1013 商品下架
*/
@POST(commodityOffline)
@Headers("Content-Type: application/json")
fun commodityOffline(
@QueryMap commonParams: Map<String, String>,
@QueryMap requestParams: Map<String, String?>
): Observable<HttpResult<Any?>>
}
package com.yidian.shenghuoquan.commodity.http.callback
/**
* author: yinjiacheng
* date: 7/7/21 8:40 AM
* description: /goods/customer/online /goods/customer/offline
*/
interface ICommodityOperationCallback {
fun commodityOnlineSuccess()
fun commodityOnlineFailure(message: String?)
fun commodityOfflineSuccess()
fun commodityOfflineFailure(message: String?)
}
package com.yidian.shenghuoquan.commodity.http.callback
import com.yidian.shenghuoquan.commodity.dto.CommodityManagementListDto
/**
* author: yinjiacheng
* date: 7/4/21 3:28 PM
* description: /goods/customer/my_goods
*/
interface IGetCommodityManagementListCallback {
fun getCommodityListSuccess(result: CommodityManagementListDto?)
fun getCommodityListFailure(message: String?)
}
package com.yidian.shenghuoquan.commodity.http.callback
import com.yidian.shenghuoquan.commodity.dto.CommodityStatus
/**
* author: yinjiacheng
* date: 7/6/21 10:45 AM
* description: /goods/business/my_goods_status_list
*/
interface IGetCommodityStatusListCallback {
fun getCommodityStatusListSuccess(result: ArrayList<CommodityStatus>?)
fun getCommodityStatusListFailure(message: String?)
}
package com.yidian.shenghuoquan.commodity.ui.coupon
import androidx.activity.viewModels
import androidx.fragment.app.Fragment
import androidx.viewpager2.adapter.FragmentStateAdapter
import com.google.android.material.tabs.TabLayoutMediator
import com.yidian.common.XRouterPathConstants
import com.yidian.common.mvvm.BaseMvvmActivity
import com.yidian.shenghuoquan.commodity.R
import com.yidian.shenghuoquan.commodity.databinding.CommodityActivityCommodityManagementBinding
import com.yidian.shenghuoquan.commodity.ui.coupon.fragment.CommodityListFragment
import com.yidian.shenghuoquan.commodity.ui.coupon.viewmodel.CommodityManagementViewModel
import com.yidian.utils.ToastUtil
import com.yidian.xpage.XPageViewProtocol
/**
* author: yinjiacheng
* date: 7/1/21 8:05 PM
* description: 商品管理
*/
class CommodityManagementActivity : BaseMvvmActivity<CommodityActivityCommodityManagementBinding, CommodityManagementViewModel>(),
XPageViewProtocol {
override val layoutId: Int = R.layout.commodity_activity_commodity_management
override val vm: CommodityManagementViewModel by viewModels()
override fun initView() {
vm.commodityStatusList.observe(this, {
// ViewPager2设置适配器
binding.vpCommodityList.adapter = object : FragmentStateAdapter(this) {
override fun getItemCount() = it.size
override fun createFragment(position: Int): Fragment {
return CommodityListFragment(it[position])
}
}
// TabLayout与ViewPager2绑定
TabLayoutMediator(
binding.tlCommodityList, binding.vpCommodityList
) { tab, position ->
tab.text = it[position].name
}.attach()
})
// 请求商品状态列表
vm.requestCommodityStatusList()
//发布商品
binding.tvCommodityPublish.setOnClickListener {
// TODO: 7/7/21 跳转H5
// Test
ToastUtil.showToast(this, "跳转商品发布")
}
}
override fun getXPageName(): String {
return XRouterPathConstants.commodityManagement
}
}
package com.yidian.shenghuoquan.commodity.ui.coupon.adapter
import android.content.Context
import android.graphics.Paint
import android.graphics.Rect
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.ImageView
import androidx.databinding.BindingAdapter
import androidx.databinding.DataBindingUtil
import androidx.databinding.ViewDataBinding
import androidx.lifecycle.LifecycleOwner
import androidx.recyclerview.widget.RecyclerView
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.common.mvvm.BaseViewModel
import com.yidian.common.widget.CommonHintDialog
import com.yidian.shenghuoquan.commodity.BR
import com.yidian.shenghuoquan.commodity.R
import com.yidian.shenghuoquan.commodity.databinding.CommodityItemCommodityAuditListBinding
import com.yidian.shenghuoquan.commodity.databinding.CommodityItemCommodityOfflineListBinding
import com.yidian.shenghuoquan.commodity.databinding.CommodityItemCommodityOnlineListBinding
import com.yidian.shenghuoquan.commodity.databinding.CommodityItemCommodityRejectListBinding
import com.yidian.shenghuoquan.commodity.dto.CommodityStatus
import com.yidian.shenghuoquan.commodity.dto.Goods
import com.yidian.shenghuoquan.commodity.ui.coupon.viewmodel.CommodityListItemViewModel
import com.yidian.utils.DensityUtil
import com.yidian.utils.ToastUtil
/**
* author: yinjiacheng
* date: 7/2/21 2:33 PM
* description: 商品管理列表adapter
*/
class CommodityListAdapter(private val context: Context, private val status: CommodityStatus) :
RecyclerView.Adapter<RecyclerView.ViewHolder>() {
companion object {
// 商品状态标识
private const val ID_COMMODITY_ONLINE = 1
private const val ID_COMMODITY_AUDIT = 2
private const val ID_COMMODITY_REJECT = 3
private const val ID_COMMODITY_OFFLINE = 4
/**
* 加载圆角图片
* @param url 图片url
* @param corner 圆角值
* @param target 目标ImageView
*/
@BindingAdapter(value = ["url", "corner"], requireAll = true)
@JvmStatic
fun loadRoundCornerImage(target: ImageView, url: String, corner: Int = 12) {
Glide.with(target.context).load(url)
.apply(RequestOptions().transform(CenterCrop(), RoundedCorners(DensityUtil.dp2px(corner.toFloat()))))
.into(target)
}
/**
* 加载圆角图片
* @param urlList 图片urlList
* @param corner 圆角值
* @param target 目标ImageView
*/
@BindingAdapter(value = ["urlList", "corner"], requireAll = true)
@JvmStatic
fun loadRoundCornerImage(target: ImageView, urlList: List<String>, corner: Int = 12) {
if (urlList.isEmpty()) return
Glide.with(target.context).load(urlList[0])
.apply(RequestOptions().transform(CenterCrop(), RoundedCorners(DensityUtil.dp2px(corner.toFloat()))))
.into(target)
}
}
/**
* 商品数据
*/
private val commodityData by lazy { ArrayList<Goods>() }
/**
* 更新数据
*/
fun updateData(data: List<Goods>?) {
data?.let {
notifyItemRangeRemoved(0, commodityData.size)
commodityData.clear()
commodityData.addAll(it)
notifyItemRangeInserted(0, commodityData.size)
}
}
/**
* 插入数据
*/
fun insertData(data: List<Goods>?) {
data?.let {
commodityData.addAll(it)
notifyItemRangeInserted(commodityData.size - it.size, it.size)
}
}
/**
* 获取DataBinding
*/
private fun <VB : ViewDataBinding> getBinding(parent: ViewGroup, layoutResId: Int, viewModel: BaseViewModel): VB {
val binding = DataBindingUtil.inflate<VB>(LayoutInflater.from(parent.context), layoutResId, parent, false)
binding.setVariable(BR.vm, viewModel)
// binding.lifecycleOwner = context as LifecycleOwner
return binding
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
when (viewType) {
// 上架中
ID_COMMODITY_ONLINE -> {
return getBinding<CommodityItemCommodityOnlineListBinding>(
parent,
R.layout.commodity_item_commodity_online_list, CommodityListItemViewModel()
).let { CommodityOnlineItemViewHolder(it, it.root) }
}
// 被驳回
ID_COMMODITY_REJECT -> {
return getBinding<CommodityItemCommodityRejectListBinding>(
parent,
R.layout.commodity_item_commodity_reject_list, CommodityListItemViewModel()
).let { CommodityRejectItemViewHolder(it, it.root) }
}
// 已下架
ID_COMMODITY_OFFLINE -> {
return getBinding<CommodityItemCommodityOfflineListBinding>(
parent,
R.layout.commodity_item_commodity_offline_list, CommodityListItemViewModel()
).let { CommodityOfflineItemViewHolder(it, it.root) }
}
// 默认审核中
else -> {
return getBinding<CommodityItemCommodityAuditListBinding>(
parent,
R.layout.commodity_item_commodity_audit_list, CommodityListItemViewModel()
).let { CommodityAuditItemViewHolder(it, it.root) }
}
}
}
override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
// 绑定数据
val data = commodityData[position]
when (holder) {
is CommodityOnlineItemViewHolder -> {
holder.binding.data = data
holder.binding.vm?.commodityOfflineOperationEvent?.observe(context as LifecycleOwner, {
// 弹出确认下架弹窗
CommonHintDialog(context, "确认下架优惠券?", arrayListOf("取消", "下架"), object : CommonHintDialog.OnHintOptionCallback {
override fun onLeftOption() {
}
override fun onRightOption() {
// 下架商品
holder.binding.vm?.requestCommodityOffline(it.goodsSpuId)
}
}).show()
})
holder.binding.vm?.commodityOfflineSuccessEvent?.observe(context as LifecycleOwner, {
// 下架成功 刷新列表
ToastUtil.showToast(context, "下架成功")
commodityData.remove(data)
notifyItemRemoved(position)
})
}
is CommodityAuditItemViewHolder -> {
holder.binding.data = data
}
is CommodityRejectItemViewHolder -> {
holder.binding.data = data
}
is CommodityOfflineItemViewHolder -> {
holder.binding.data = data
holder.binding.vm?.commodityOnlineSuccessEvent?.observe(context as LifecycleOwner, {
// 上架成功 刷新列表
ToastUtil.showToast(context, "上架成功")
commodityData.remove(data)
notifyItemRemoved(position)
})
}
}
}
override fun getItemCount(): Int {
return commodityData.size
}
override fun getItemViewType(position: Int): Int {
return status.tabId
}
/**
* ViewHolder定义
*/
class CommodityOnlineItemViewHolder(val binding: CommodityItemCommodityOnlineListBinding, itemView: View) :
RecyclerView.ViewHolder(itemView) {
init {
// 商品原价加删除线
binding.tvCommodityOriginalPrice.paint.flags = Paint.STRIKE_THRU_TEXT_FLAG
binding.tvCommodityOriginalPrice.paint.isAntiAlias = true
}
}
class CommodityAuditItemViewHolder(val binding: CommodityItemCommodityAuditListBinding, itemView: View) :
RecyclerView.ViewHolder(itemView) {
init {
binding.tvCommodityOriginalPrice.paint.flags = Paint.STRIKE_THRU_TEXT_FLAG
binding.tvCommodityOriginalPrice.paint.isAntiAlias = true
}
}
class CommodityRejectItemViewHolder(val binding: CommodityItemCommodityRejectListBinding, itemView: View) :
RecyclerView.ViewHolder(itemView) {
init {
binding.tvCommodityOriginalPrice.paint.flags = Paint.STRIKE_THRU_TEXT_FLAG
binding.tvCommodityOriginalPrice.paint.isAntiAlias = true
}
}
class CommodityOfflineItemViewHolder(val binding: CommodityItemCommodityOfflineListBinding, itemView: View) :
RecyclerView.ViewHolder(itemView) {
init {
binding.tvCommodityOriginalPrice.paint.flags = Paint.STRIKE_THRU_TEXT_FLAG
binding.tvCommodityOriginalPrice.paint.isAntiAlias = true
}
}
class CommodityItemDecoration : RecyclerView.ItemDecoration() {
override fun getItemOffsets(outRect: Rect, view: View, parent: RecyclerView, state: RecyclerView.State) {
outRect.bottom = DensityUtil.dp2px(10f)
}
}
}
package com.yidian.shenghuoquan.commodity.ui.coupon.fragment
import androidx.fragment.app.viewModels
import androidx.recyclerview.widget.LinearLayoutManager
import com.scwang.smart.refresh.layout.api.RefreshLayout
import com.scwang.smart.refresh.layout.listener.OnLoadMoreListener
import com.scwang.smart.refresh.layout.listener.OnRefreshListener
import com.yidian.common.mvvm.BaseMvvmFragment
import com.yidian.shenghuoquan.commodity.R
import com.yidian.shenghuoquan.commodity.databinding.CommodityFragmentCommodityListBinding
import com.yidian.shenghuoquan.commodity.dto.CommodityStatus
import com.yidian.shenghuoquan.commodity.ui.coupon.adapter.CommodityListAdapter
import com.yidian.shenghuoquan.commodity.ui.coupon.viewmodel.CommodityListViewModel
/**
* author: yinjiacheng
* date: 7/2/21 10:44 AM
* description: 商品列表
*/
class CommodityListFragment(private val status: CommodityStatus) :
BaseMvvmFragment<CommodityFragmentCommodityListBinding, CommodityListViewModel>(R.layout.commodity_fragment_commodity_list),
OnRefreshListener, OnLoadMoreListener {
private val adapter by lazy { activity?.let { CommodityListAdapter(it, status) } }
override val vm: CommodityListViewModel by viewModels()
override fun initView() {
initRecyclerView()
initRefresh()
subscribeLiveData()
// 首次加载
binding.rlCommodityList.autoRefresh()
}
private fun initRecyclerView() {
binding.rvCommodityList.layoutManager = LinearLayoutManager(activity, LinearLayoutManager.VERTICAL, false)
binding.rvCommodityList.adapter = adapter
binding.rvCommodityList.addItemDecoration(CommodityListAdapter.CommodityItemDecoration())
}
private fun initRefresh() {
binding.rlCommodityList.setOnRefreshListener(this)
binding.rlCommodityList.setOnLoadMoreListener(this)
}
/**
* 订阅数据
*/
private fun subscribeLiveData() {
vm.refreshFinish.observe(this, {
binding.rlCommodityList.finishRefresh()
adapter?.updateData(it)
})
vm.loadMoreFinish.observe(this, {
binding.rlCommodityList.finishLoadMore()
adapter?.insertData(it)
})
}
override fun onRefresh(refreshLayout: RefreshLayout) {
// 触发下拉刷新
vm.requestCommodityManagementList(status, null, CommodityListViewModel.LoadType.REFRESH)
}
override fun onLoadMore(refreshLayout: RefreshLayout) {
// 触发上拉加载更多
vm.requestCommodityManagementList(status, null, CommodityListViewModel.LoadType.LOAD_MORE)
}
}
package com.yidian.shenghuoquan.commodity.ui.coupon.viewmodel
import androidx.lifecycle.MutableLiveData
import com.yidian.common.YdBaseApplication
import com.yidian.common.mvvm.BaseViewModel
import com.yidian.shenghuoquan.commodity.dto.Goods
import com.yidian.shenghuoquan.commodity.http.CouponDataSource
import com.yidian.shenghuoquan.commodity.http.callback.ICommodityOperationCallback
import com.yidian.utils.ToastUtil
/**
* author: yinjiacheng
* date: 7/3/21 2:18 PM
* description: 商品
*/
class CommodityListItemViewModel : BaseViewModel(), ICommodityOperationCallback {
companion object {
// 商品spu_id
private const val PARAMS_COMMODITY_ID = "goods_spu_id"
}
// 商品上架操作事件
val commodityOnlineOperationEvent by lazy { MutableLiveData<Goods>() }
// 商品上架成功事件
val commodityOnlineSuccessEvent by lazy { MutableLiveData<Unit>() }
// 商品下架操作事件
val commodityOfflineOperationEvent by lazy { MutableLiveData<Goods>() }
// 商品下架成功事件
val commodityOfflineSuccessEvent by lazy { MutableLiveData<Unit>() }
// 商品编辑操作事件
val commodityEditOperationEvent by lazy { MutableLiveData<Goods>() }
/**
* 商品上架
*/
fun commodityOnline(item: Goods) {
requestCommodityOnline(item.goodsSpuId)
}
/**
* 商品下架
*/
fun commodityOffline(item: Goods) {
// 发送数据
commodityOfflineOperationEvent.value = item
}
/**
* 商品编辑
*/
fun commodityEdit(item: Goods) {
startCommodityEdit(item.goodsSpuId)
}
/**
* 请求商品上架
*/
fun requestCommodityOnline(commodityId: String) {
CouponDataSource.commodityOnline(this, hashMapOf(Pair(PARAMS_COMMODITY_ID, commodityId)))
}
/**
* 请求商品下架
*/
fun requestCommodityOffline(commodityId: String) {
CouponDataSource.commodityOffline(this, hashMapOf(Pair(PARAMS_COMMODITY_ID, commodityId)))
}
/**
* 跳转商品编辑页面
*/
private fun startCommodityEdit(commodityId: String) {
// TODO: 7/7/21 跳转H5
// Test
ToastUtil.showToast(YdBaseApplication.context, "跳转商品编辑")
}
override fun commodityOnlineSuccess() {
// 商品上架成功 发送事件
commodityOnlineSuccessEvent.value = Unit
}
override fun commodityOnlineFailure(message: String?) {
}
override fun commodityOfflineSuccess() {
// 商品下架成功 发送事件
commodityOfflineSuccessEvent.value = Unit
}
override fun commodityOfflineFailure(message: String?) {
}
}
package com.yidian.shenghuoquan.commodity.ui.coupon.viewmodel
import androidx.lifecycle.MutableLiveData
import com.yidian.common.mvvm.BaseViewModel
import com.yidian.shenghuoquan.commodity.dto.CommodityManagementListDto
import com.yidian.shenghuoquan.commodity.dto.CommodityStatus
import com.yidian.shenghuoquan.commodity.dto.Goods
import com.yidian.shenghuoquan.commodity.http.CouponDataSource
import com.yidian.shenghuoquan.commodity.http.callback.IGetCommodityManagementListCallback
/**
* author: yinjiacheng
* date: 7/2/21 10:44 AM
* description: 商品列表
*/
class CommodityListViewModel : BaseViewModel(), IGetCommodityManagementListCallback {
companion object {
// 商品类型
private const val PARAMS_COMMODITY_TYPE = "type"
// 当前生活号id
private const val PARAMS_LIFE_ACCOUNT_ID = "life_account_id"
// 每页数量
private const val PARAMS_COMMODITY_LIST_PAGE_SIZE = "num"
// 上一次列表中最后一个goods_spu_id
private const val PARAMS_COMMODITY_LIST_LAST_ID = "last_id"
}
/**
* 记录上一次请求列表中最后一项id
*/
private var lastId: String? = null
/**
* 列表加载类型
*/
private var loadType: LoadType? = null
/**
* 刷新完成和上拉加载完成LiveData
*/
val refreshFinish by lazy { MutableLiveData<List<Goods>>() }
val loadMoreFinish by lazy { MutableLiveData<List<Goods>>() }
/**
* 请求商品管理列表
* @param status 商品状态
* @param pageSize 每页数据量 分页加载用
* @param type 列表加载类型
*/
fun requestCommodityManagementList(status: CommodityStatus, pageSize: Int?, type: LoadType) {
// 记录加载类型
loadType = type
// 下拉刷新重置lastRequestIndex
if (type == LoadType.REFRESH) lastId = null
val requestParams = HashMap<String, String?>(4)
requestParams[PARAMS_COMMODITY_TYPE] = status.type
// TODO: 7/7/21 入参生活号id
// requestParams[PARAMS_LIFE_ACCOUNT_ID] = Hawk.get(HawkConfig.LifeAccountId, null)
pageSize?.let { requestParams[PARAMS_COMMODITY_LIST_PAGE_SIZE] = it.toString() }
lastId?.let { requestParams[PARAMS_COMMODITY_LIST_LAST_ID] = it }
CouponDataSource.getCommodityManagementList(this, requestParams)
}
override fun getCommodityListSuccess(result: CommodityManagementListDto?) {
// lastId为-1时即没有下一页数据 此时不记录
result?.lastId?.let { if (it != "-1") lastId = it }
// 通知下拉刷新或上拉加载更多完成
when (loadType) {
LoadType.REFRESH -> refreshFinish.value = result?.goodsList
LoadType.LOAD_MORE -> loadMoreFinish.value = result?.goodsList
else -> return
}
}
override fun getCommodityListFailure(message: String?) {
when (loadType) {
LoadType.REFRESH -> refreshFinish.value = null
LoadType.LOAD_MORE -> loadMoreFinish.value = null
else -> return
}
}
/**
* 列表加载类型
*/
enum class LoadType {
// 初次加载
INITIALIZE,
// 下拉刷新
REFRESH,
// 上拉加载更多
LOAD_MORE
}
}
package com.yidian.shenghuoquan.commodity.ui.coupon.viewmodel
import androidx.lifecycle.MutableLiveData
import com.yidian.common.mvvm.BaseViewModel
import com.yidian.shenghuoquan.commodity.dto.CommodityStatus
import com.yidian.shenghuoquan.commodity.http.CouponDataSource
import com.yidian.shenghuoquan.commodity.http.callback.IGetCommodityStatusListCallback
/**
* author: yinjiacheng
* date: 7/1/21 8:01 PM
* description: 商品管理
*/
class CommodityManagementViewModel : BaseViewModel(), IGetCommodityStatusListCallback {
/**
* 商品状态数据
*/
val commodityStatusList by lazy { MutableLiveData<ArrayList<CommodityStatus>>() }
/**
* 请求商品状态列表
*/
fun requestCommodityStatusList() {
CouponDataSource.getCommodityStatusList(this)
}
override fun getCommodityStatusListSuccess(result: ArrayList<CommodityStatus>?) {
// 数据回传
commodityStatusList.value = result
}
override fun getCommodityStatusListFailure(message: String?) {
}
}
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<!-- 若不设置 gravity,则 Indicator 宽度会填满整个 item -->
<item android:gravity="center_horizontal">
<shape>
<corners android:radius="@dimen/dp10" />
<size
android:width="@dimen/dp12"
android:height="@dimen/dp3" />
</shape>
</item>
</layer-list>
\ No newline at end of file
<?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.commodity.ui.coupon.viewmodel.CommodityManagementViewModel" />
</data>
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<com.yidian.common.widget.CommonTopBarView
android:id="@+id/bv_top_bar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:CommonTopBarView_title_text="@string/coupon_management"
app:layout_constraintTop_toTopOf="parent" />
<com.google.android.material.tabs.TabLayout
android:id="@+id/tl_commodity_list"
android:layout_width="match_parent"
android:layout_height="@dimen/dp46"
android:layout_marginStart="@dimen/dp20"
android:layout_marginEnd="@dimen/dp20"
app:layout_constraintTop_toBottomOf="@id/bv_top_bar"
app:tabBackground="@color/transparent"
app:tabIndicator="@drawable/layer_commodity_list_indicator"
app:tabIndicatorColor="@color/color_333333"
app:tabIndicatorFullWidth="false"
app:tabMode="scrollable"
app:tabRippleColor="@color/transparent"
app:tabSelectedTextColor="@color/color_333333"
app:tabTextAppearance="@style/Commodity.Manager.Indicator"
app:tabTextColor="@color/color_666666" />
<androidx.viewpager2.widget.ViewPager2
android:id="@+id/vp_commodity_list"
android:layout_width="match_parent"
android:layout_height="0dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintTop_toBottomOf="@id/tl_commodity_list" />
<TextView
android:id="@+id/tv_commodity_publish"
android:layout_width="@dimen/dp160"
android:layout_height="@dimen/dp44"
android:layout_marginBottom="@dimen/dp34"
android:background="@drawable/shape_bg_common_btn"
android:gravity="center"
android:text="@string/publish_coupon"
android:textColor="@color/white"
android:textSize="@dimen/sp18"
android:textStyle="bold"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
</layout>
\ No newline at end of file
<?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.commodity.ui.coupon.viewmodel.CommodityListViewModel" />
</data>
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<com.scwang.smart.refresh.layout.SmartRefreshLayout
android:id="@+id/rl_commodity_list"
android:layout_width="match_parent"
android:layout_height="match_parent">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/rv_commodity_list"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingStart="@dimen/dp16"
android:paddingTop="@dimen/dp8"
android:paddingEnd="@dimen/dp16"
android:paddingBottom="@dimen/dp8" />
</com.scwang.smart.refresh.layout.SmartRefreshLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
</layout>
\ No newline at end of file
<?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.commodity.ui.coupon.viewmodel.CommodityListItemViewModel" />
<variable
name="data"
type="com.yidian.shenghuoquan.commodity.dto.Goods" />
</data>
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@drawable/shape_bg_common_card"
android:minHeight="@dimen/dp112"
android:padding="@dimen/dp16">
<ImageView
android:id="@+id/iv_commodity_pic"
android:layout_width="@dimen/dp80"
android:layout_height="@dimen/dp80"
app:corner="@{12}"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:urlList="@{data.descPicUrlList}"
tools:src="@mipmap/news_icon" />
<TextView
android:id="@+id/tv_commodity_name"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/dp12"
android:ellipsize="end"
android:maxLines="2"
android:text="@{data.goodsName}"
android:textColor="@color/color_333333"
android:textSize="@dimen/sp16"
android:textStyle="bold"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toEndOf="@id/iv_commodity_pic"
app:layout_constraintTop_toTopOf="parent"
tools:text="北蔡街 -0.99抢北蔡街 -0.99抢北蔡街 -0.99抢北蔡街 -0.99抢" />
<TextView
android:id="@+id/tv_commodity_count_sold"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{@string/commodity_count_sold(data.totalAmountSold)}"
android:textColor="@color/color_999999"
android:textSize="@dimen/sp12"
app:layout_constraintStart_toStartOf="@id/tv_commodity_name"
app:layout_constraintTop_toBottomOf="@id/tv_commodity_name"
tools:text="已售 100000" />
<TextView
android:id="@+id/tv_commodity_count_inventory"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/dp12"
android:text="@{@string/commodity_count_inventory(data.inventoryRest)}"
android:textColor="@color/color_999999"
android:textSize="@dimen/sp12"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0"
app:layout_constraintStart_toEndOf="@id/tv_commodity_count_sold"
app:layout_constraintTop_toTopOf="@id/tv_commodity_count_sold"
tools:text="库存 100000000000000" />
<TextView
android:id="@+id/tv_commodity_price_symbol"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="¥"
android:textColor="@color/color_F26E3D"
android:textSize="@dimen/sp16"
app:layout_constraintBaseline_toBaselineOf="@id/tv_commodity_price"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="@id/tv_commodity_name" />
<TextView
android:id="@+id/tv_commodity_price"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/dp4"
android:text="@{@string/commodity_price(data.price)}"
android:textColor="@color/color_F26E3D"
android:textSize="@dimen/sp24"
android:textStyle="bold"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toEndOf="@id/tv_commodity_price_symbol"
app:layout_constraintTop_toBottomOf="@id/tv_commodity_count_sold"
tools:text="10.00" />
<TextView
android:id="@+id/tv_commodity_original_price"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/dp6"
android:text="@{@string/commodity_original_price((int) data.originalPrice)}"
android:textColor="@color/color_999999"
android:textSize="@dimen/sp12"
app:layout_constraintBaseline_toBaselineOf="@id/tv_commodity_price"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toEndOf="@id/tv_commodity_price"
tools:text="12.00" />
</androidx.constraintlayout.widget.ConstraintLayout>
</layout>
\ No newline at end of file
<?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.commodity.ui.coupon.viewmodel.CommodityListItemViewModel" />
<variable
name="data"
type="com.yidian.shenghuoquan.commodity.dto.Goods" />
</data>
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@drawable/shape_bg_common_card"
android:minHeight="@dimen/dp112"
android:padding="@dimen/dp16">
<ImageView
android:id="@+id/iv_commodity_pic"
android:layout_width="@dimen/dp80"
android:layout_height="@dimen/dp80"
app:corner="@{12}"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:urlList="@{data.descPicUrlList}"
tools:src="@mipmap/news_icon" />
<TextView
android:id="@+id/tv_commodity_name"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/dp12"
android:ellipsize="end"
android:maxLines="2"
android:text="@{data.goodsName}"
android:textColor="@color/color_333333"
android:textSize="@dimen/sp16"
android:textStyle="bold"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toEndOf="@id/iv_commodity_pic"
app:layout_constraintTop_toTopOf="parent"
tools:text="北蔡街 -0.99抢北蔡街 -0.99抢北蔡街 -0.99抢北蔡街 -0.99抢" />
<TextView
android:id="@+id/tv_commodity_count_sold"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{@string/commodity_count_sold(data.totalAmountSold)}"
android:textColor="@color/color_999999"
android:textSize="@dimen/sp12"
app:layout_constraintStart_toStartOf="@id/tv_commodity_name"
app:layout_constraintTop_toBottomOf="@id/tv_commodity_name"
tools:text="已售 100000" />
<TextView
android:id="@+id/tv_commodity_count_inventory"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/dp12"
android:text="@{@string/commodity_count_inventory(data.inventoryRest)}"
android:textColor="@color/color_999999"
android:textSize="@dimen/sp12"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0"
app:layout_constraintStart_toEndOf="@id/tv_commodity_count_sold"
app:layout_constraintTop_toTopOf="@id/tv_commodity_count_sold"
tools:text="库存 100000000000000" />
<TextView
android:id="@+id/tv_commodity_price_symbol"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="¥"
android:textColor="@color/color_F26E3D"
android:textSize="@dimen/sp16"
app:layout_constraintBaseline_toBaselineOf="@id/tv_commodity_price"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="@id/tv_commodity_name" />
<TextView
android:id="@+id/tv_commodity_price"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/dp4"
android:text="@{@string/commodity_price(data.price)}"
android:textColor="@color/color_F26E3D"
android:textSize="@dimen/sp24"
android:textStyle="bold"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toEndOf="@id/tv_commodity_price_symbol"
app:layout_constraintTop_toBottomOf="@id/tv_commodity_count_sold"
tools:text="10.00" />
<TextView
android:id="@+id/tv_commodity_original_price"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/dp6"
android:text="@{@string/commodity_original_price((int) data.originalPrice)}"
android:textColor="@color/color_999999"
android:textSize="@dimen/sp12"
app:layout_constraintBaseline_toBaselineOf="@id/tv_commodity_price"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toEndOf="@id/tv_commodity_price"
tools:text="12.00" />
<TextView
android:id="@+id/tv_commodity_action"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="@dimen/dp25"
android:onClick="@{() -> vm.commodityOnline(data)}"
android:text="@string/up_shelves"
android:textColor="@color/color_333333"
android:textSize="@dimen/sp14"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@id/tv_commodity_edit"
tools:text="上架" />
<View
android:id="@+id/view_divider"
android:layout_width="@dimen/dp1"
android:layout_height="@dimen/dp9"
android:background="@color/color_F2F2F2"
app:layout_constraintBottom_toBottomOf="@id/tv_commodity_action"
app:layout_constraintEnd_toStartOf="@id/tv_commodity_edit"
app:layout_constraintStart_toEndOf="@id/tv_commodity_action"
app:layout_constraintTop_toTopOf="@id/tv_commodity_action" />
<TextView
android:id="@+id/tv_commodity_edit"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="@{() -> vm.commodityEdit(data)}"
android:text="@string/edit"
android:textColor="@color/color_1852F1"
android:textSize="@dimen/sp14"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
tools:text="编辑" />
</androidx.constraintlayout.widget.ConstraintLayout>
</layout>
\ No newline at end of file
<?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.commodity.ui.coupon.viewmodel.CommodityListItemViewModel" />
<variable
name="data"
type="com.yidian.shenghuoquan.commodity.dto.Goods" />
</data>
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@drawable/shape_bg_common_card"
android:minHeight="@dimen/dp112"
android:padding="@dimen/dp16">
<ImageView
android:id="@+id/iv_commodity_pic"
android:layout_width="@dimen/dp80"
android:layout_height="@dimen/dp80"
app:corner="@{12}"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:urlList="@{data.descPicUrlList}"
tools:src="@mipmap/news_icon" />
<TextView
android:id="@+id/tv_commodity_name"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/dp12"
android:ellipsize="end"
android:maxLines="2"
android:text="@{data.goodsName}"
android:textColor="@color/color_333333"
android:textSize="@dimen/sp16"
android:textStyle="bold"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toEndOf="@id/iv_commodity_pic"
app:layout_constraintTop_toTopOf="parent"
tools:text="北蔡街 -0.99抢北蔡街 -0.99抢北蔡街 -0.99抢北蔡街 -0.99抢" />
<TextView
android:id="@+id/tv_commodity_count_sold"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{@string/commodity_count_sold(data.totalAmountSold)}"
android:textColor="@color/color_999999"
android:textSize="@dimen/sp12"
app:layout_constraintStart_toStartOf="@id/tv_commodity_name"
app:layout_constraintTop_toBottomOf="@id/tv_commodity_name"
tools:text="已售 100000" />
<TextView
android:id="@+id/tv_commodity_count_inventory"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/dp12"
android:text="@{@string/commodity_count_inventory(data.inventoryRest)}"
android:textColor="@color/color_999999"
android:textSize="@dimen/sp12"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0"
app:layout_constraintStart_toEndOf="@id/tv_commodity_count_sold"
app:layout_constraintTop_toTopOf="@id/tv_commodity_count_sold"
tools:text="库存 100000000000000" />
<TextView
android:id="@+id/tv_commodity_price_symbol"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="¥"
android:textColor="@color/color_F26E3D"
android:textSize="@dimen/sp16"
app:layout_constraintBaseline_toBaselineOf="@id/tv_commodity_price"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="@id/tv_commodity_name" />
<TextView
android:id="@+id/tv_commodity_price"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/dp4"
android:text="@{@string/commodity_price(data.price)}"
android:textColor="@color/color_F26E3D"
android:textSize="@dimen/sp24"
android:textStyle="bold"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toEndOf="@id/tv_commodity_price_symbol"
app:layout_constraintTop_toBottomOf="@id/tv_commodity_count_sold"
tools:text="10.00" />
<TextView
android:id="@+id/tv_commodity_original_price"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/dp6"
android:text="@{@string/commodity_original_price((int) data.originalPrice)}"
android:textColor="@color/color_999999"
android:textSize="@dimen/sp12"
app:layout_constraintBaseline_toBaselineOf="@id/tv_commodity_price"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toEndOf="@id/tv_commodity_price"
tools:text="12.00" />
<TextView
android:id="@+id/tv_commodity_action"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="@dimen/dp25"
android:clickable="true"
android:focusable="true"
android:onClick="@{() -> vm.commodityOffline(data)}"
android:text="@string/down_shelves"
android:textColor="@color/color_333333"
android:textSize="@dimen/sp14"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@id/tv_commodity_edit"
tools:text="下架" />
<View
android:id="@+id/view_divider"
android:layout_width="@dimen/dp1"
android:layout_height="@dimen/dp9"
android:background="@color/color_F2F2F2"
app:layout_constraintBottom_toBottomOf="@id/tv_commodity_action"
app:layout_constraintEnd_toStartOf="@id/tv_commodity_edit"
app:layout_constraintStart_toEndOf="@id/tv_commodity_action"
app:layout_constraintTop_toTopOf="@id/tv_commodity_action" />
<TextView
android:id="@+id/tv_commodity_edit"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="@{() -> vm.commodityEdit(data)}"
android:text="@string/edit"
android:textColor="@color/color_1852F1"
android:textSize="@dimen/sp14"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
tools:text="编辑" />
</androidx.constraintlayout.widget.ConstraintLayout>
</layout>
\ No newline at end of file
<?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.commodity.ui.coupon.viewmodel.CommodityListItemViewModel" />
<variable
name="data"
type="com.yidian.shenghuoquan.commodity.dto.Goods" />
</data>
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@drawable/shape_bg_common_card"
android:minHeight="@dimen/dp112"
android:padding="@dimen/dp16">
<ImageView
android:id="@+id/iv_commodity_pic"
android:layout_width="@dimen/dp80"
android:layout_height="@dimen/dp80"
app:corner="@{12}"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:urlList="@{data.descPicUrlList}"
tools:src="@mipmap/news_icon" />
<TextView
android:id="@+id/tv_commodity_name"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/dp12"
android:ellipsize="end"
android:maxLines="2"
android:text="@{data.goodsName}"
android:textColor="@color/color_333333"
android:textSize="@dimen/sp16"
android:textStyle="bold"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toEndOf="@id/iv_commodity_pic"
app:layout_constraintTop_toTopOf="parent"
tools:text="北蔡街 -0.99抢北蔡街 -0.99抢北蔡街 -0.99抢北蔡街 -0.99抢" />
<TextView
android:id="@+id/tv_commodity_count_sold"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{@string/commodity_count_sold(data.totalAmountSold)}"
android:textColor="@color/color_999999"
android:textSize="@dimen/sp12"
app:layout_constraintStart_toStartOf="@id/tv_commodity_name"
app:layout_constraintTop_toBottomOf="@id/tv_commodity_name"
tools:text="已售 100000" />
<TextView
android:id="@+id/tv_commodity_count_inventory"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/dp12"
android:text="@{@string/commodity_count_inventory(data.inventoryRest)}"
android:textColor="@color/color_999999"
android:textSize="@dimen/sp12"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0"
app:layout_constraintStart_toEndOf="@id/tv_commodity_count_sold"
app:layout_constraintTop_toTopOf="@id/tv_commodity_count_sold"
tools:text="库存 100000000000000" />
<TextView
android:id="@+id/tv_commodity_price_symbol"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="¥"
android:textColor="@color/color_F26E3D"
android:textSize="@dimen/sp16"
app:layout_constraintBaseline_toBaselineOf="@id/tv_commodity_price"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="@id/tv_commodity_name" />
<TextView
android:id="@+id/tv_commodity_price"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/dp4"
android:text="@{@string/commodity_price(data.price)}"
android:textColor="@color/color_F26E3D"
android:textSize="@dimen/sp24"
android:textStyle="bold"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toEndOf="@id/tv_commodity_price_symbol"
app:layout_constraintTop_toBottomOf="@id/tv_commodity_count_sold"
tools:text="10.00" />
<TextView
android:id="@+id/tv_commodity_original_price"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/dp6"
android:text="@{@string/commodity_original_price((int) data.originalPrice)}"
android:textColor="@color/color_999999"
android:textSize="@dimen/sp12"
app:layout_constraintBaseline_toBaselineOf="@id/tv_commodity_price"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toEndOf="@id/tv_commodity_price"
tools:text="12.00" />
<TextView
android:id="@+id/tv_commodity_edit"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="@{() -> vm.commodityEdit(data)}"
android:text="@string/edit"
android:textColor="@color/color_1852F1"
android:textSize="@dimen/sp14"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
tools:text="编辑" />
</androidx.constraintlayout.widget.ConstraintLayout>
</layout>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:tools="http://schemas.android.com/tools" tools:ignore="MissingTranslation">
<string name="coupon_management">优惠券管理</string>
<string name="commodity_count_sold">已售 %d</string>
<string name="commodity_count_inventory">库存 %d</string>
<string name="commodity_original_price">¥%d</string>
<string name="commodity_price">%.2f</string>
<string name="down_shelves">下架</string>
<string name="edit">编辑</string>
<string name="up_shelves">上架</string>
<string name="publish_coupon">发布优惠券</string>
</resources>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="Commodity.Manager.Indicator" parent="TextAppearance.Design.Tab">
<item name="android:textSize">@dimen/sp18</item>
</style>
</resources>
\ No newline at end of file
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