This commit is contained in:
马增飞
2025-11-06 19:28:59 +08:00
parent 30ce3499eb
commit 73ba4431e7
12 changed files with 597 additions and 135 deletions
@@ -22,7 +22,6 @@ import com.sw.inbound.model.response.SearchGoodsInfo
import com.sw.inbound.objbox.Food
import com.sw.inbound.objbox.FoodCollectionBean
import com.sw.inbound.objbox.FoodModule
import com.sw.inbound.objbox.Food_
import com.sw.inbound.objbox.ObjectBox
import com.sw.inbound.utils.BitmapCropper
import com.sw.inbound.utils.BitmapSaver
@@ -153,25 +152,25 @@ class FoodCollectionActivity : ComponentActivity() {
binding.btnTakePhoto.clickWithDebounce {
takePhoto()
}
binding.btnAddDefault.clickWithDebounce {
Thread{
FoodModule.initDefFoodData(this) {
runOnUiThread {
toast("添加完成")
}
}
}.start()
}
binding.btnRemoveDefault.clickWithDebounce {
initBox()
val list = box?.all?.filter { it.foodIdx == FoodModule.DEFAULT_FOOD_INDEX }
if (list.isNullOrEmpty()) {
toast("不存在默认数据")
return@clickWithDebounce
}
box?.removeByIds(list.map { it.id })
toast("移除完成")
}
// binding.btnAddDefault.clickWithDebounce {
// Thread{
// FoodModule.initDefFoodData(this) {
// runOnUiThread {
// toast("添加完成")
// }
// }
// }.start()
// }
// binding.btnRemoveDefault.clickWithDebounce {
// initBox()
// val list = box?.all?.filter { it.foodIdx == FoodModule.DEFAULT_FOOD_INDEX }
// if (list.isNullOrEmpty()) {
// toast("不存在默认数据")
// return@clickWithDebounce
// }
// box?.removeByIds(list.map { it.id })
// toast("移除完成")
// }
binding.btnClearData.setOnClickListener { clearData() }
binding.rvSearch.let {
it.layoutManager = GridLayoutManager(this, 2, LinearLayoutManager.VERTICAL, false)
@@ -188,31 +187,31 @@ class FoodCollectionActivity : ComponentActivity() {
searchGoods()
}
}
binding.radioGroup.setOnCheckedChangeListener { group, checkedId ->
if (checkedId == R.id.rbCollected) {
binding.llSearchInput.gone()
binding.refreshLayout.let {
it.setEnableRefresh(false)
it.setEnableLoadMore(false)
}
getCollectedGoods()
return@setOnCheckedChangeListener
}
if (checkedId == R.id.rbSearch) {
binding.llSearchInput.visible()
pageNo = 1
clickIndex = -1
searchGoodsList.clear()
searchAdapter.notifyDataSetChanged()
binding.refreshLayout.let {
it.setEnableRefresh(true)
it.setEnableLoadMore(false)
}
loadEmptyView()
return@setOnCheckedChangeListener
}
}
binding.radioGroup.check(R.id.rbCollected)
// binding.radioGroup.setOnCheckedChangeListener { group, checkedId ->
// if (checkedId == R.id.rbCollected) {
// binding.llSearchInput.gone()
// binding.refreshLayout.let {
// it.setEnableRefresh(false)
// it.setEnableLoadMore(false)
// }
// getCollectedGoods()
// return@setOnCheckedChangeListener
// }
// if (checkedId == R.id.rbSearch) {
// binding.llSearchInput.visible()
// pageNo = 1
// clickIndex = -1
// searchGoodsList.clear()
// searchAdapter.notifyDataSetChanged()
// binding.refreshLayout.let {
// it.setEnableRefresh(true)
// it.setEnableLoadMore(false)
// }
// loadEmptyView()
// return@setOnCheckedChangeListener
// }
// }
// binding.radioGroup.check(R.id.rbCollected)
}
@SuppressLint("NotifyDataSetChanged")
@@ -18,6 +18,7 @@ import com.sw.inbound.databinding.ActivityGoodsListBinding
import com.sw.inbound.databinding.LayoutCameraPreviewBinding
import com.sw.inbound.databinding.ListItemReceiptGoodsBinding
import com.sw.inbound.databinding.ListItemSelfProcurementBinding
import com.sw.inbound.dialog.DialogManager
import com.sw.inbound.dialog.DropdownPopup
import com.sw.inbound.dialog.GoodsRecognizeDialog
import com.sw.inbound.dialog.GoodsSearchDialog
@@ -60,7 +61,7 @@ abstract class GoodsListActivity : ComponentActivity() {
public const val IS_NEW_RECEIPT = "isNewReceipt"
const val PAGE_SIZE = 10
private const val DELAY_TIME = 30 * 1000
private const val DELAY_TIME = 10 * 1000
}
var isReceiptPage: Boolean = false
@@ -164,10 +165,12 @@ abstract class GoodsListActivity : ComponentActivity() {
//}
if (weight < 200) {
if (abs(weight) < 10) {
if (goodsRecognizeDialog?.isShowing == true) {
goodsRecognizeDialog?.dismiss()
isShowRecognizeDialog = true
goodsRecognizeDialog = null
if (DialogManager.getDialogList().size == 1 &&
DialogManager.contains("GoodsRecognizeDialog") &&
goodsRecognizeDialog?.isShowing == true) {
goodsRecognizeDialog?.dismiss()
isShowRecognizeDialog = true
goodsRecognizeDialog = null
}
}
return
@@ -0,0 +1,56 @@
package com.sw.inbound.adapter
import android.content.Context
import android.view.LayoutInflater
import android.view.ViewGroup
import androidx.core.graphics.toColorInt
import com.chad.library.adapter4.BaseQuickAdapter
import com.chad.library.adapter4.viewholder.QuickViewHolder
import com.sw.inbound.databinding.ListItemCollectSearchBinding
import com.sw.inbound.model.response.SearchGoodsInfo
import com.sw.inbound.utils.ext.dp
import com.sw.inbound.utils.ext.setShapeDrawable
class CollectSearchAdapter(var list: MutableList<SearchGoodsInfo.Record>) :
BaseQuickAdapter<SearchGoodsInfo.Record, CollectSearchAdapter.VH>(list) {
inner class VH(var binding: ListItemCollectSearchBinding) : QuickViewHolder(binding.root)
override fun onCreateViewHolder(context: Context, parent: ViewGroup, viewType: Int): VH {
val inflater = LayoutInflater.from(context)
val binding = ListItemCollectSearchBinding.inflate(inflater, parent, false)
return VH(binding)
}
override fun onBindViewHolder(holder: VH, position: Int, item: SearchGoodsInfo.Record?) {
holder.binding.let {
it.tvGoodsName.run {
text = item!!.goodsName
// setTextColor(if (item!!.isSelected) "#FF0032C8".toColorInt() else "#FF666666".toColorInt())
setTextColor("#FF666666".toColorInt())
}
// it.root.run {
// if (item!!.isSelected) {
// setShapeDrawable(
// solidColor = "#FFEAF0FF",
// strokeColor = "#FF0033CC",
// strokeWidth = 2.dp,
// radius = 10.dp
// )
// } else {
// setShapeDrawable(
// solidColor = "#FFF5F5F5",
// radius = 10.dp
// )
// }
// }
it.root.run {
setShapeDrawable(
solidColor = "#FFF5F5F5",
radius = 10.dp
)
}
}
}
}
@@ -47,4 +47,14 @@ abstract class BaseDialog(
}
return null
}
override fun show() {
super.show()
DialogManager.addDialog(this)
}
override fun dismiss() {
super.dismiss()
DialogManager.removeDialog(this)
}
}
@@ -0,0 +1,188 @@
package com.sw.inbound.dialog
import android.annotation.SuppressLint
import android.content.Context
import android.view.LayoutInflater
import android.view.View
import androidx.recyclerview.widget.GridLayoutManager
import androidx.recyclerview.widget.LinearLayoutManager
import com.sw.inbound.R
import com.sw.inbound.activity.GoodsListActivity
import com.sw.inbound.adapter.CollectSearchAdapter
import com.sw.inbound.databinding.DialogCollectSearchBinding
import com.sw.inbound.databinding.LayoutEmptySearchBinding
import com.sw.inbound.model.response.SearchGoodsInfo
import com.sw.inbound.objbox.Food
import com.sw.inbound.objbox.ObjectBox
import com.sw.inbound.utils.ext.addOnActionSearchListener
import com.sw.inbound.utils.ext.hideKeyboard
import com.sw.inbound.utils.ext.toast
import io.objectbox.Box
import io.objectbox.kotlin.boxFor
@SuppressLint("NotifyDataSetChanged")
class CollectSearchDialog(
context: Context
) : BaseDialog(context) {
private lateinit var inflater: LayoutInflater
private var emptyBinding: LayoutEmptySearchBinding? = null
private lateinit var binding: DialogCollectSearchBinding
override fun getRootView(): View {
inflater = LayoutInflater.from(context)
binding = DialogCollectSearchBinding.inflate(inflater)
return binding.root
}
private var activity: GoodsListActivity? = null
override fun initView() {
activity = getReceiptActivity()
binding.ivClose.setOnClickListener { dismiss() }
binding.ivGoodsSearch.setOnClickListener { searchGoods() }
binding.etInputGoods.let { v ->
v.addOnActionSearchListener {
searchGoods()
}
}
binding.btnConfirm.setOnClickListener {
dismiss()
}
binding.rvSearch.let {
it.layoutManager = GridLayoutManager(context, 2, LinearLayoutManager.VERTICAL, false)
it.adapter = searchAdapter
}
binding.refreshLayout.let {
it.setEnableRefresh(true)
it.setEnableLoadMore(false)
it.setOnRefreshListener {
pageNo = 1
searchGoods()
}
it.setOnLoadMoreListener {
searchGoods()
}
}
getCollectGoods()
}
private var pageNo = 1
companion object {
private const val PAGE_SIZE = 10
}
@SuppressLint("NotifyDataSetChanged")
private fun searchGoods() {
val searchName = binding.etInputGoods.text.toString().trim()
if (searchName.isBlank()) {
activity?.toast("请输入物品名称")
finishRefresh()
return
}
activity?.searchGoods(
searchName = searchName,
pageNo = pageNo,
pageSize = PAGE_SIZE
) { records ->
finishRefresh()
binding.etInputGoods.hideKeyboard()
if (pageNo == 1) {
list.clear()
}
list.addAll(records)
if (list.isEmpty()) {
loadEmptyView()
return@searchGoods
}
val enableLoadMore = records.size >= PAGE_SIZE
binding.refreshLayout.setEnableLoadMore(enableLoadMore)
if (enableLoadMore) {
pageNo++
}
binding.rvSearch.layoutManager =
GridLayoutManager(context, 2, GridLayoutManager.VERTICAL, false)
searchAdapter.notifyDataSetChanged()
}
}
private fun loadEmptyView() {
binding.rvSearch.layoutManager =
LinearLayoutManager(context, LinearLayoutManager.VERTICAL, false)
if (emptyBinding == null) {
emptyBinding = LayoutEmptySearchBinding.inflate(inflater, binding.rvSearch, false)
}
emptyBinding?.root?.let { layout ->
layout.setOnClickListener { layout.hideKeyboard() }
searchAdapter.stateView = layout
}
}
private var clickIndex = -1
private val list: MutableList<SearchGoodsInfo.Record> = mutableListOf()
private val searchAdapter by lazy {
CollectSearchAdapter(list).apply {
isStateViewEnable = true
setOnItemClickListener { _, _, position ->
this@CollectSearchDialog.clickIndex = position
if (list[position].isSelected) {
return@setOnItemClickListener
}
list.forEach { item ->
item.isSelected = false
}
list[position].isSelected = true
notifyDataSetChanged()
}
addOnItemChildClickListener(R.id.ivDelete) { _, _, position ->
deleteGoods(position)
}
}
}
private fun deleteGoods(position:Int) {
WarnDialog(context = context, content = "请确认是否删除该物品?", confirmBlock = {
Thread{
activity?.runOnUiThread {
Loading.show(context)
}
val name = list[position].goodsName
val filterIdList = box?.all?.filter { it.name == name }?.map { it.id }
box?.removeByIds(filterIdList)
activity?.runOnUiThread {
Loading.dismiss()
list.removeAt(position)
searchAdapter.notifyDataSetChanged()
activity?.toast("删除成功")
}
}.start()
}).show()
}
private fun finishRefresh() {
binding.refreshLayout.let {
if (pageNo == 1) {
it.finishRefresh(500)
} else {
it.finishLoadMore(500)
}
}
}
private var box: Box<Food>? = null
@SuppressLint("NotifyDataSetChanged")
private fun getCollectGoods() {
if (box == null) {
box = ObjectBox.boxStore.boxFor(Food::class)
}
box?.all?.distinctBy { it.name }?.forEach {
list.add((SearchGoodsInfo.Record(goodsName = it.name)))
}
binding.rvSearch.layoutManager = GridLayoutManager(activity, 2, LinearLayoutManager.VERTICAL, false)
searchAdapter.notifyDataSetChanged()
if (list.isEmpty()) {
loadEmptyView()
}
}
}
@@ -0,0 +1,43 @@
package com.sw.inbound.dialog
object DialogManager {
private var dialogList:MutableList<BaseDialog> = mutableListOf()
fun addDialog(dialog: BaseDialog) {
if (dialogList.contains(dialog).not()) {
val className = dialog.javaClass.simpleName
val item = dialogList.firstOrNull { it.javaClass.simpleName == className }
item?.dismiss()
dialogList.add(dialog)
}
}
fun removeDialog(dialog: BaseDialog) {
dialogList.remove(dialog)
}
fun getDialogList():MutableList<BaseDialog> {
return dialogList
}
fun dismissAll() {
dialogList.forEach {
it.dismiss()
}
}
fun dismissAllExcept(dialog: BaseDialog) {
dialogList.forEach {
if (it != dialog) {
it.dismiss()
}
}
}
fun contains(vararg className: String):Boolean {
val item = dialogList.firstOrNull { className.contains(it.javaClass.simpleName) }
return item != null
}
}
@@ -187,8 +187,12 @@ class GoodsStoreDialog(
}
val id = unitTag.toString()
val count = getUnitCount(id)
if (count.isBlank() || "0" == count) {
binding.etProcurementCount.setText("")
return@readWeightInfo
}
val currentCount = binding.etProcurementCount.text.toString().trim()
if (currentCount == count || count.isBlank() || "0" == count) {
if (currentCount == count) {
return@readWeightInfo
}
binding.etProcurementCount.let {
@@ -96,7 +96,7 @@ object FoodModule {
nameScoreList.add(IdNameScore(id = it.id, name = box.get(it.id).name?:"", score = it.score))
}
Timber.tag("FoodModule").d("queryFood数据:${nameScoreList.toJsonString()}")
idScoreList.filter { it.score < 0.01 }.forEach {
idScoreList.filter { it.score < 0.10 }.forEach {
val food = box.get(it.id)
//FoodQueryResult(id = it.id, name = food.name, foodIdx = food.foodIdx, score = it.score)
food.name?.let { key ->
@@ -34,9 +34,9 @@ object SensorScaleUtils {
// SensorScale.STATE_OVER_WEIGHT -> "量程溢出"
// else -> "未知"
//}
if (state != SensorScale.STATE_STABLE) {
return
}
// if (state != SensorScale.STATE_STABLE) {
// return
// }
Handler(Looper.getMainLooper()).post {
weightCallback?.invoke((value * 1000).toInt())
}
@@ -50,29 +50,29 @@
android:textSize="24sp"
android:textStyle="bold" />
<TextView
android:id="@+id/btnAddDefault"
android:layout_width="wrap_content"
android:layout_height="60dp"
android:background="@drawable/bg_white_stroke_blue_ripple"
android:gravity="center_vertical"
android:paddingHorizontal="10dp"
android:text="加载默认数据"
android:textColor="#FF0032C8"
android:textSize="18sp" />
<!-- <TextView-->
<!-- android:id="@+id/btnAddDefault"-->
<!-- android:layout_width="wrap_content"-->
<!-- android:layout_height="60dp"-->
<!-- android:background="@drawable/bg_white_stroke_blue_ripple"-->
<!-- android:gravity="center_vertical"-->
<!-- android:paddingHorizontal="10dp"-->
<!-- android:text="加载默认数据"-->
<!-- android:textColor="#FF0032C8"-->
<!-- android:textSize="18sp" />-->
<TextView
android:id="@+id/btnRemoveDefault"
android:layout_width="wrap_content"
android:layout_height="60dp"
android:layout_marginStart="20dp"
android:layout_marginEnd="20dp"
android:background="@drawable/bg_white_stroke_blue_ripple"
android:gravity="center_vertical"
android:paddingHorizontal="10dp"
android:text="移除默认数据"
android:textColor="#FF0032C8"
android:textSize="18sp" />
<!-- <TextView-->
<!-- android:id="@+id/btnRemoveDefault"-->
<!-- android:layout_width="wrap_content"-->
<!-- android:layout_height="60dp"-->
<!-- android:layout_marginStart="20dp"-->
<!-- android:layout_marginEnd="20dp"-->
<!-- android:background="@drawable/bg_white_stroke_blue_ripple"-->
<!-- android:gravity="center_vertical"-->
<!-- android:paddingHorizontal="10dp"-->
<!-- android:text="移除默认数据"-->
<!-- android:textColor="#FF0032C8"-->
<!-- android:textSize="18sp" />-->
</LinearLayout>
<FrameLayout
@@ -165,68 +165,68 @@
tools:listitem="@layout/list_item_food_collection" />
<LinearLayout
android:id="@+id/layoutTab"
android:layout_width="0dp"
android:layout_height="80dp"
android:layout_marginHorizontal="20dp"
android:gravity="center_vertical"
android:orientation="horizontal"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toEndOf="@id/rvFoodCollection"
app:layout_constraintTop_toTopOf="@id/flPreview">
<!-- <LinearLayout-->
<!-- android:id="@+id/layoutTab"-->
<!-- android:layout_width="0dp"-->
<!-- android:layout_height="80dp"-->
<!-- android:layout_marginHorizontal="20dp"-->
<!-- android:gravity="center_vertical"-->
<!-- android:orientation="horizontal"-->
<!-- app:layout_constraintEnd_toEndOf="parent"-->
<!-- app:layout_constraintStart_toEndOf="@id/rvFoodCollection"-->
<!-- app:layout_constraintTop_toTopOf="@id/flPreview">-->
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center_vertical"
android:text="物品筛选:"
android:textColor="#ff333333"
android:textSize="24sp"
android:textStyle="bold" />
<!-- <TextView-->
<!-- android:layout_width="wrap_content"-->
<!-- android:layout_height="wrap_content"-->
<!-- android:gravity="center_vertical"-->
<!-- android:text="物品筛选:"-->
<!-- android:textColor="#ff333333"-->
<!-- android:textSize="24sp"-->
<!-- android:textStyle="bold" />-->
<RadioGroup
android:id="@+id/radioGroup"
android:layout_width="match_parent"
android:layout_height="80dp"
android:layout_marginHorizontal="20dp"
android:gravity="center_vertical"
android:orientation="horizontal"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toEndOf="@id/rvFoodCollection"
app:layout_constraintTop_toTopOf="@id/flPreview">
<!-- <RadioGroup-->
<!-- android:id="@+id/radioGroup"-->
<!-- android:layout_width="match_parent"-->
<!-- android:layout_height="80dp"-->
<!-- android:layout_marginHorizontal="20dp"-->
<!-- android:gravity="center_vertical"-->
<!-- android:orientation="horizontal"-->
<!-- app:layout_constraintEnd_toEndOf="parent"-->
<!-- app:layout_constraintStart_toEndOf="@id/rvFoodCollection"-->
<!-- app:layout_constraintTop_toTopOf="@id/flPreview">-->
<RadioButton
android:id="@+id/rbCollected"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:button="@null"
android:drawableStart="@drawable/radio_check"
android:drawablePadding="20dp"
android:paddingStart="20dp"
android:paddingEnd="0dp"
android:text="已采集物品"
android:textColor="@color/radio_filter"
android:textSize="24sp" />
<!-- <RadioButton-->
<!-- android:id="@+id/rbCollected"-->
<!-- android:layout_width="0dp"-->
<!-- android:layout_height="match_parent"-->
<!-- android:layout_weight="1"-->
<!-- android:button="@null"-->
<!-- android:drawableStart="@drawable/radio_check"-->
<!-- android:drawablePadding="20dp"-->
<!-- android:paddingStart="20dp"-->
<!-- android:paddingEnd="0dp"-->
<!-- android:text="已采集物品"-->
<!-- android:textColor="@color/radio_filter"-->
<!-- android:textSize="24sp" />-->
<RadioButton
android:id="@+id/rbSearch"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:button="@null"
android:drawableStart="@drawable/radio_check"
android:drawablePadding="20dp"
android:paddingStart="20dp"
android:paddingEnd="0dp"
android:text="搜索物品"
android:textColor="@color/radio_filter"
android:textSize="24sp" />
<!-- <RadioButton-->
<!-- android:id="@+id/rbSearch"-->
<!-- android:layout_width="0dp"-->
<!-- android:layout_height="match_parent"-->
<!-- android:layout_weight="1"-->
<!-- android:button="@null"-->
<!-- android:drawableStart="@drawable/radio_check"-->
<!-- android:drawablePadding="20dp"-->
<!-- android:paddingStart="20dp"-->
<!-- android:paddingEnd="0dp"-->
<!-- android:text="搜索物品"-->
<!-- android:textColor="@color/radio_filter"-->
<!-- android:textSize="24sp" />-->
</RadioGroup>
<!-- </RadioGroup>-->
</LinearLayout>
<!-- </LinearLayout>-->
<LinearLayout
android:id="@+id/llSearchInput"
@@ -236,10 +236,10 @@
android:background="@drawable/bg_gray"
android:gravity="center_vertical"
android:orientation="horizontal"
android:visibility="gone"
android:visibility="visible"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toEndOf="@id/rvFoodCollection"
app:layout_constraintTop_toBottomOf="@id/layoutTab">
app:layout_constraintTop_toTopOf="@id/flPreview">
<EditText
android:id="@+id/etGoodsInput"
@@ -0,0 +1,126 @@
<?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"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="1500dp"
android:layout_height="900dp"
android:background="@drawable/bg_white_radius12"
tools:ignore="HardcodedText">
<ImageView
android:id="@+id/ivClose"
android:layout_width="80dp"
android:layout_height="80dp"
android:layout_marginTop="30dp"
android:layout_marginEnd="30dp"
android:padding="10dp"
android:src="@mipmap/ic_close"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent"
tools:ignore="ContentDescription" />
<TextView
android:id="@+id/tvDialogTitle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="已采集物品检索"
android:textColor="#ff141428"
android:textSize="36sp"
android:textStyle="bold"
app:layout_constraintBottom_toTopOf="@+id/flSearchBlock"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<FrameLayout
android:id="@+id/flSearchBlock"
android:layout_width="match_parent"
android:layout_height="80dp"
android:layout_marginHorizontal="150dp"
android:layout_marginTop="180dp"
android:background="@drawable/bg_white_radius10_stroke2"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent">
<EditText
android:id="@+id/etInputGoods"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#00000000"
android:gravity="center"
android:hint="输入物品名称"
android:maxLines="1"
android:paddingStart="10dp"
android:paddingEnd="80dp"
android:textColor="#FF666666"
android:textColorHint="#FFC7C8DC"
android:textSize="30sp"
android:inputType="text"
android:imeOptions="actionSearch" />
<ImageView
android:id="@+id/ivGoodsSearch"
android:layout_width="60dp"
android:layout_height="60dp"
android:layout_gravity="end|center_vertical"
android:layout_marginEnd="16dp"
android:padding="14dp"
android:src="@mipmap/ic_goods_search" />
</FrameLayout>
<com.scwang.smart.refresh.layout.SmartRefreshLayout
android:id="@+id/refreshLayout"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_marginHorizontal="130dp"
android:layout_marginTop="40dp"
android:layout_marginBottom="58dp"
app:layout_constraintBottom_toTopOf="@id/dividerLine"
app:layout_constraintTop_toBottomOf="@id/flSearchBlock">
<com.scwang.smart.refresh.header.ClassicsHeader
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/rvSearch"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:overScrollMode="never"
app:layoutManager="androidx.recyclerview.widget.GridLayoutManager"
app:spanCount="2"
tools:itemCount="8"
tools:listitem="@layout/list_item_goods_search" />
<com.scwang.smart.refresh.footer.ClassicsFooter
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</com.scwang.smart.refresh.layout.SmartRefreshLayout>
<View
android:id="@+id/dividerLine"
android:layout_width="match_parent"
android:layout_height="1dp"
android:layout_marginHorizontal="40dp"
android:layout_marginBottom="160dp"
android:background="#FFDCDCF0"
app:layout_constraintBottom_toBottomOf="parent" />
<Button
android:id="@+id/btnConfirm"
android:layout_width="240dp"
android:layout_height="80dp"
android:background="@drawable/bg_blue_ripple"
android:text="确定"
android:textColor="@color/white"
android:textSize="30sp"
android:textStyle="bold"
android:layout_marginStart="30dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="@id/dividerLine" />
</androidx.constraintlayout.widget.ConstraintLayout>
@@ -0,0 +1,33 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="82dp"
android:layout_marginVertical="10dp"
android:layout_marginHorizontal="20dp"
android:orientation="horizontal"
android:gravity="center_vertical"
tools:background="@drawable/bg_white_stroke_blue_ripple">
<TextView
android:id="@+id/tvGoodsName"
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="wrap_content"
android:layout_gravity="center"
tools:text="高杆白菜"
android:textColor="#ff666666"
android:textSize="30sp"
android:layout_marginStart="30dp"
android:maxLines="1"
android:layout_marginHorizontal="10dp"
android:ellipsize="end"
android:textStyle="bold" />
<ImageView
android:id="@+id/ivDelete"
android:layout_width="80dp"
android:layout_height="80dp"
android:padding="25dp"
android:src="@mipmap/ic_close"/>
</LinearLayout>