今天遇到一需求,商品加入到采购单里面的问题
增加数量时,商品包含最少起订量(如最少买10个)
点击加减都是以10为单位加减,
输入框输入数量时,没有输入是的整数时,变为向下最近十的整数。
开始我把计算方式放在了onTextChanged 和afterTextChanged
没有用 mHandler.postDelayed(mRunnable, 800)
没输入一位,都回去计算,导致永远是0,
还有一种情况就是赋值后,检测到变化,继续赋值,陷入死循环中,
下方为正确的解决方法:
此计算放在edittext用户输入完毕后
mHandler.removeCallbacks(mRunnable);
//800毫秒没有输入认为输入完毕 计算入最少起订量是10 输入19 向下取整 10
mHandler.postDelayed(mRunnable, 800)
//计算完成后,给edittext赋值
val mHandler = object : Handler() {
override fun handleMessage(msg: Message) {
super.handleMessage(msg)
if (1 === msg.what) {
var num = if (etNum.text.isNullOrEmpty()) 0 else Integer.valueOf(etNum.text.toString().trim())
var num1 = Math.abs(num / minCount) * minCount
if (minCount > 1 && num != num1) {
num = Math.abs(num / minCount) * minCount
etNum.setText("$num")
etNum.setSelection(etNum.text.length)
}
}
}
}
val mRunnable = Runnable { mHandler.sendEmptyMessage(1) }
需要给Edittext添加监听,
editext.addTextChangedListener(watcher)
// 输入框内容监听
val watcher = object : TextWatcher {
override fun afterTextChanged(s: Editable?) {}
override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {}
override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {
var num = if (etNum.text.isNullOrEmpty()) 0 else Integer.valueOf(etNum.text.toString().trim())
if (num < 0) {
etNum.setText("0")
etNum.setSelection(etNum.text.length)
num = 0
ToastUtil.showCustomToast("不能在减少啦")
tvSub.isEnabled = false
tvAdd.isEnabled = true
} else tvSub.isEnabled = true
if (num > (data.actual_stock ?: 0) + (data.virtual_stock ?: 0)) {
etNum.setText("${(data.actual_stock ?: 0) + (data.virtual_stock ?: 0)}")
num = (data.actual_stock ?: 0) + (data.virtual_stock ?: 0)
ToastUtil.showCustomToast("库存不足")
tvSub.isEnabled = true
tvAdd.isEnabled = false
etNum.setSelection(etNum.text.length)
} else tvAdd.isEnabled = true
mHandler.removeCallbacks(mRunnable);
//800毫秒没有输入认为输入完毕 计算入最少起订量是10 输入19 向下取整 10
mHandler.postDelayed(mRunnable, 800)
data.selectCount = num
onNumChanged?.onChanged(holder.adapterPosition, num)
//逻辑结束后,在加入监听
}
}