如何使用Kotlin在RecyclerView末尾添加按钮
RecyclerView末尾添加按钮实现方案
通过Adapter多视图类型实现即可,不需要额外嵌套布局,滑动时按钮会跟随列表固定在内容底部显示,具体修改如下:
- 新建按钮项布局
创建布局文件rv_item_add_btn.xml,放入你需要的按钮控件,示例代码:
- 新建按钮项布局
<?xml version="1.0" encoding="utf-8"?> <Button xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/btnAddPlayer" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_margin="16dp" android:text="添加新玩家"/>
- 修改Adapter代码,增加多类型支持
首先在MyAdapter中定义两种视图类型常量,重写几个核心方法,注意Adapter继承的ViewHolder泛型要改为通用的RecyclerView.ViewHolder:
- 修改Adapter代码,增加多类型支持
class MyAdapter(private val myList: List<Player>) : RecyclerView.Adapter<RecyclerView.ViewHolder>() { // 视图类型常量 private val TYPE_ITEM = 0 private val TYPE_BTN = 1 override fun getItemCount(): Int { // 总长度是列表长度+1个按钮位 return myList.size + 1 } override fun getItemViewType(position: Int): Int { // 最后一个位置返回按钮类型 return if (position == myList.size) TYPE_BTN else TYPE_ITEM } override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder { val inflater = LayoutInflater.from(parent.context) return when (viewType) { TYPE_ITEM -> { val view = inflater.inflate(R.layout.view_for_rv, parent, false) MyHolder(view) } else -> { val view = inflater.inflate(R.layout.rv_item_add_btn, parent, false) AddBtnHolder(view) } } } override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { when (holder) { is MyHolder -> { // 普通列表项正常绑定数据 val item = myList[position] holder.bind(item) } is AddBtnHolder -> { // 按钮绑定点击事件 holder.itemView.setOnClickListener { // 此处填写按钮点击后的业务逻辑 } } } } }
- 新增按钮对应的ViewHolder类
不需要额外绑定逻辑,直接继承基础ViewHolder即可:
- 新增按钮对应的ViewHolder类
class AddBtnHolder(view: View) : RecyclerView.ViewHolder(view)
注意:你当前MainActivity中每次livedata数据回调都重新创建Adapter实例会造成性能浪费,可以提前初始化Adapter,数据更新时调用Adapter的
notifyDataSetChanged()方法刷新列表即可,不修改也不会影响按钮功能的正常运行。
内容的提问来源于stack exchange,提问作者M.hossein Karimi
相关产品推荐
相关产品推荐

