今天遇到一需求,商品加入到採購單裏面的問題
增加數量時,商品包含最少起訂量(如最少買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)
//邏輯結束後,在加入監聽
}
}