You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Dialog中RecyclerView smoothScroll失效:编辑数量后无法滚动至最后位置

解决Dialog关闭后列表未自动滚动到末尾的问题

嘿,我明白你的问题了:在StockerFragment里,扫码扫到已存在的条码时,会平滑滚动到对应位置并弹出模态Dialog编辑数量,但用户在输入框按回车关闭Dialog后,列表并没有自动滚回最后位置——这个小问题其实是因为回车关闭Dialog的逻辑里,没加上后续滚动的触发动作。

咱们一步步来解决:

第一步:给你的ModalQtyOnKeyListener加个回调接口

首先,我们需要让Dialog在关闭后能通知Fragment“我关了,你该执行滚动了”,所以给监听器加个回调:

// 先定义一个回调接口,用来通知Fragment处理后续操作
interface OnQtyEditCompletedListener {
    fun onQtyEditDone()
}

class ModalQtyOnKeyListener(
    private val dialog: Dialog,
    private val listener: OnQtyEditCompletedListener // 把回调传进来
) : View.OnKeyListener {
    override fun onKey(v: View?, keyCode: Int, event: KeyEvent?): Boolean {
        // 只处理回车抬起的事件
        if (keyCode == KeyEvent.KEYCODE_ENTER && event?.action == KeyEvent.ACTION_UP) {
            // 这里先处理你的数量保存逻辑(比如把输入的数量更新到数据源)
            // ... 你的保存代码 ...
            
            dialog.dismiss() // 关闭Dialog
            listener.onQtyEditDone() // 触发回调,告诉Fragment该滚动了
            return true
        }
        return false
    }
}

第二步:在StockerFragment里实现滚动逻辑

在你创建并显示Dialog的地方,传入这个回调,在回调方法里让列表滚动到最后一项:

// 假设你的列表是RecyclerView,实例叫stockRecyclerView,适配器是stockAdapter
private fun showQtyEditDialog() {
    val dialog = Dialog(requireContext())
    // 初始化Dialog布局、找到数量输入框
    val qtyEditText = dialog.findViewById<EditText>(R.id.et_qty)
    
    // 给输入框设置按键监听器,同时传入回调
    qtyEditText.setOnKeyListener(ModalQtyOnKeyListener(dialog) {
        // Dialog关闭后,执行滚动到末尾的操作
        stockRecyclerView.post {
            val lastItemPosition = stockAdapter.itemCount - 1
            if (lastItemPosition >= 0) {
                // 平滑滚动到最后一项
                stockRecyclerView.smoothScrollToPosition(lastItemPosition)
            }
        }
    })
    
    dialog.show()
}

为啥要加post?

因为Dialog刚关闭的时候,界面可能还在处理关闭的动画和布局重绘,直接调用滚动可能会不生效。用post把滚动操作放到UI线程的队列末尾,等Dialog完全关闭、界面状态稳定后再执行,就能确保滚动顺利触发了。

如果你用的是ListView?

那把smoothScrollToPosition换成smoothScrollToPositionFromTop(lastItemPosition, 0)或者直接setSelection(lastItemPosition)就行,原理是一样的。

这样修改后,用户按回车关闭Dialog的瞬间,就会自动触发列表滚动到最后位置,完美解决你的问题~

内容的提问来源于stack exchange,提问作者Kakashi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 10:22:43