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

如何实现点击showBottomDialogBtn弹出底部弹窗及RecyclerView单选功能

单选底部对话框实现方案

1. 点击按钮弹出底部对话框

直接用Android官方提供的BottomSheetDialog组件实现,代码示例如下:

showBottomDialogBtn.setOnClickListener {
    // 初始化底部对话框实例
    val bottomSheetDialog = BottomSheetDialog(this@MainActivity)
    // 加载自定义对话框布局
    val dialogView = layoutInflater.inflate(R.layout.dialog_bottom_select, null)
    bottomSheetDialog.setContentView(dialogView)
    
    // 此处插入下面RecyclerView的初始化逻辑
    initRecyclerView(dialogView, bottomSheetDialog)
    
    bottomSheetDialog.show()
}

2. 实现单选RecyclerView

第一步:定义数据结构

新增字段记录条目选中状态:

data class OptionItem(
    val content: String,
    var isSelected: Boolean = false
)

第二步:实现单选适配器

内部维护选中位置,点击时自动切换选中状态:

class SingleSelectAdapter(
    private val dataList: List<OptionItem>,
    private val onSelect: (OptionItem) -> Unit
) : RecyclerView.Adapter<SingleSelectAdapter.VH>() {
    // 记录当前选中位置,默认-1代表无选中
    private var currentSelectedPos = -1

    inner class VH(itemView: View) : RecyclerView.ViewHolder(itemView) {
        val tvContent: TextView = itemView.findViewById(R.id.tv_content)
        val ivCheck: ImageView = itemView.findViewById(R.id.iv_check)
    }

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): VH {
        val view = LayoutInflater.from(parent.context)
            .inflate(R.layout.item_single_select, parent, false)
        return VH(view)
    }

    override fun onBindViewHolder(holder: VH, position: Int) {
        val item = dataList[position]
        holder.tvContent.text = item.content
        // 根据选中状态更新UI
        if (item.isSelected) {
            holder.ivCheck.visibility = View.VISIBLE
            holder.tvContent.setTextColor(Color.BLUE)
        } else {
            holder.ivCheck.visibility = View.GONE
            holder.tvContent.setTextColor(Color.BLACK)
        }
        // 点击切换选中状态
        holder.itemView.setOnClickListener {
            if (currentSelectedPos != position) {
                // 重置上一个选中条目的状态
                if (currentSelectedPos != -1) {
                    dataList[currentSelectedPos].isSelected = false
                    notifyItemChanged(currentSelectedPos)
                }
                // 更新当前选中条目状态
                currentSelectedPos = position
                item.isSelected = true
                notifyItemChanged(position)
                // 触发选中回调
                onSelect.invoke(item)
            }
        }
    }

    override fun getItemCount() = dataList.size
}

第三步:绑定适配器到对话框的RecyclerView

private fun initRecyclerView(dialogView: View, dialog: BottomSheetDialog) {
    val rvSelect = dialogView.findViewById<RecyclerView>(R.id.rv_select)
    rvSelect.layoutManager = LinearLayoutManager(this)
    // 构造测试数据
    val optionList = listOf(
        OptionItem("选项1"),
        OptionItem("选项2"),
        OptionItem("选项3"),
        OptionItem("选项4")
    )
    val adapter = SingleSelectAdapter(optionList) { selectedItem ->
        // 选中后处理逻辑,比如弹提示、关闭对话框
        Toast.makeText(this, "选中了${selectedItem.content}", Toast.LENGTH_SHORT).show()
        dialog.dismiss()
    }
    rvSelect.adapter = adapter
}

效果参考

需求参考图

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 21:57:03