class SelectableAdapter(private val itemList: List): RecyclerView.Adapter() {
private var selectedItem = -1
inner class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
val itemTextView: TextView = itemView.findViewById(R.id.item_text_view)
val itemLayout: ConstraintLayout = itemView.findViewById(R.id.item_layout)
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
val itemView = LayoutInflater.from(parent.context).inflate(R.layout.item_layout, parent, false)
return ViewHolder(itemView)
}
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
holder.itemTextView.text = itemList[position]
if (selectedItem == position) {
holder.itemLayout.setBackgroundColor(ContextCompat.getColor(holder.itemLayout.context, R.color.selected_item))
} else {
holder.itemLayout.setBackgroundColor(ContextCompat.getColor(holder.itemLayout.context, android.R.color.transparent))
}
holder.itemView.setOnClickListener {
if (selectedItem == position) {
selectedItem = -1
} else {
selectedItem = position
}
notifyDataSetChanged()
}
}
override fun getItemCount(): Int {
return itemList.size
}
fun getSelectedItem(): String? {
return if (selectedItem == -1) null else itemList[selectedItem]
}
}
在这个Adapter类中定义了一个itemList属性,其中包含了所有的选项列表;selectedItem属性,用以记录当前被选中的选项在列表中的位置,初始化为-1;然后通过ViewHolder绑定对应的视图和事件。在onBindViewHolder函数中根据当前item是否被选中动态设置背景色,并添加点击事件,当一个item被点击时,根据需要更新selectedItem并调用notifyDataSetChanged()刷新视图。最后,提供了一个getSelectedItem()方法获取被选中的item的值。
在布局文件中添加RecyclerView并为之设置一个LayoutManager,可以是LinearLayoutManager或GridLayoutManager等。
在Activity