如何创建预定义10个条目的动态RecyclerView 实现点击替换功能
RecyclerView点击替换条目实现方案
核心逻辑
- 页面初始化时构造长度为10的列表数据源,数据源索引从0开始,对应位置的条目值为
索引值+1,刚好匹配1-10的序号展示要求 - 为每个列表条目绑定点击监听,用户点击对应条目时,直接修改数据源中该位置的内容为「用户项」,调用适配器局部刷新方法更新单条目即可,无需全局刷新列表
代码实现
1. 主页面布局 activity_main.xml
页面仅需放置一个RecyclerView控件承载列表:
<?xml version="1.0" encoding="utf-8"?> <androidx.recyclerview.widget.RecyclerView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/rv_list" android:layout_width="match_parent" android:layout_height="match_parent" android:padding="16dp"/>
2. 单条目布局 item_list.xml
用简单TextView展示条目内容即可:
<?xml version="1.0" encoding="utf-8"?> <TextView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/tv_item" android:layout_width="match_parent" android:layout_height="48dp" android:gravity="center_vertical" android:textSize="16sp" android:layout_marginBottom="8dp"/>
3. 列表适配器实现
class ListAdapter : RecyclerView.Adapter<ListAdapter.ListViewHolder>() { // 初始化10条数据,内容为1-10的序号 private val dataList = MutableList(10) { (it + 1).toString() } inner class ListViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { val tvContent: TextView = itemView.findViewById(R.id.tv_item) } override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ListViewHolder { val itemView = LayoutInflater.from(parent.context) .inflate(R.layout.item_list, parent, false) return ListViewHolder(itemView) } override fun onBindViewHolder(holder: ListViewHolder, position: Int) { holder.tvContent.text = dataList[position] // 绑定条目点击事件 holder.itemView.setOnClickListener { val clickPosition = holder.bindingAdapterPosition // 规避条目动画过程中位置无效的问题 if (clickPosition != RecyclerView.NO_POSITION) { // 替换当前位置内容为用户项 dataList[clickPosition] = "用户项" // 仅刷新被点击的条目,性能最优 notifyItemChanged(clickPosition) } } } override fun getItemCount(): Int = dataList.size }
4. 主页面逻辑 MainActivity.kt
class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) val recyclerView = findViewById<RecyclerView>(R.id.rv_list) // 配置垂直线性布局管理器 recyclerView.layoutManager = LinearLayoutManager(this) // 绑定适配器 recyclerView.adapter = ListAdapter() } }
运行效果
- 首次进入页面,列表从上到下依次展示1、2……10共10个初始条目,序号和条目位置一一对应
- 点击任意条目,该条目原有序号会直接替换为用户项,其余条目状态不受影响
- 单条目局部刷新不会触发整个列表重绘,滑动、点击操作无卡顿
内容的提问来源于stack exchange,提问作者Sandeep Kumar
相关产品推荐
相关产品推荐

