Kotlin实现横向RecyclerView单选列表

1.shape_bg_border.xml
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="oval">
    <stroke
        android:width="2dp"
        android:color="@color/black" />
</shape>
2.themes.xml
<style name="ShapeAppearance.circle" parent="">
   <item name="cornerFamily">rounded</item>
   <item name="cornerSize">50%</item>
</style>
3.布局:recyclerview_list.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/black">

    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/recyclerview"
        android:layout_width="match_parent"
        android:layout_height="180dp"
        android:background="@color/white"
        android:orientation="horizontal"
        app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent" />

</androidx.constraintlayout.widget.ConstraintLayout>
4.内容Item:recyclerview_list_item.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginStart="20dp"
    android:layout_marginTop="10dp">

    <com.google.android.material.imageview.ShapeableImageView
        android:id="@+id/image"
        android:layout_width="60dp"
        android:layout_height="60dp"
        android:scaleType="centerCrop"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:shapeAppearanceOverlay="@style/ShapeAppearance.circle"
        app:srcCompat="@mipmap/ic_launcher" />

    <ImageView
        android:id="@+id/border"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:src="@drawable/shape_bg_border"
        android:visibility="gone"
        app:layout_constraintBottom_toBottomOf="@+id/image"
        app:layout_constraintEnd_toEndOf="@+id/image"
        app:layout_constraintStart_toStartOf="@+id/image"
        app:layout_constraintTop_toTopOf="parent" />

    <TextView
        android:id="@+id/text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="10dp"
        app:layout_constraintEnd_toEndOf="@+id/image"
        app:layout_constraintStart_toStartOf="@+id/image"
        app:layout_constraintTop_toBottomOf="@+id/image" />

</androidx.constraintlayout.widget.ConstraintLayout>
5.Adapter代码实现
class RvAdapter(private val context: Context, var data: ArrayList<ImageBean>) :
    RecyclerView.Adapter<RvAdapter.ViewHolder>() {
    private var onItemClickLister: OnItemClickLister? = null
    private var mSelectPosition = -1

    inner class ViewHolder(view: View) : RecyclerView.ViewHolder(view) {
        val image: ShapeableImageView = view.findViewById(R.id.image)
        val border: ImageView = view.findViewById(R.id.border)
        val text: TextView = view.findViewById(R.id.text)
    }

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
        return ViewHolder(
            LayoutInflater.from(parent.context)
                .inflate(R.layout.recyclerview_list_item, parent, false)
        )
    }

    fun setDefaultChecked(position: Int) {
        this.mSelectPosition = position
    }

    override fun onBindViewHolder(holder: ViewHolder, position: Int) {
        Glide.with(context).load(data[position].imageUrl).placeholder(R.mipmap.ic_launcher)
            .into(holder.image)
        holder.text.text = data[position].text.toString()
        holder.itemView.setOnClickListener {
            if (mSelectPosition == holder.layoutPosition) {
                return@setOnClickListener
            }
            mSelectPosition = holder.layoutPosition
            onItemClickLister?.onItemClick(holder, mSelectPosition)
        }
        if (mSelectPosition == position) {
            holder.border.visibility = View.VISIBLE
        } else {
            holder.border.visibility = View.GONE
        }
    }

    override fun getItemCount(): Int = data.size

    fun setOnItemListener(onItemClickLister: OnItemClickLister) {
        this.onItemClickLister = onItemClickLister
    }

    interface OnItemClickLister {
        fun onItemClick(holder: ViewHolder, position: Int)
    }
}
6.使用
   val recyclerView = findViewById<RecyclerView>(R.id.recyclerview)
   adapter = RvAdapter(this, initData())
   // 默认选择第1个
   adapter.setDefaultChecked(0)
   adapter.setOnItemListener(object : RvAdapter.OnItemClickLister {
       override fun onItemClick(holder: RvAdapter.ViewHolder, position: Int) {
           adapter.notifyDataSetChanged()
       }
   })
   recyclerView.adapter = adapter
7.运行截图

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
您可以按照以下步骤实现RecyclerView 的 Adapter 中实现删除数据库某张表的记录的点击事件: 1. 在 RecyclerView 的 Adapter 中,为需要响应点击事件的 View 设置 OnClickListener。 2. 在 OnClickListener 中,获取该 View 所在的数据项的位置。 3. 通过该位置获取该数据项的唯一标识。 4. 在点击事件中,调用数据库操作 API,删除该唯一标识对应的记录。 下面是 Kotlin 代码示例: ```kotlin class MyAdapter(private val dataSet: List<Data>, private val database: SQLiteDatabase) : RecyclerView.Adapter<MyAdapter.ViewHolder>() { class ViewHolder(view: View) : RecyclerView.ViewHolder(view) { val textView: TextView = view.findViewById(R.id.textView) val deleteButton: Button = view.findViewById(R.id.deleteButton) } override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { val view = LayoutInflater.from(parent.context) .inflate(R.layout.item_layout, parent, false) return ViewHolder(view) } override fun onBindViewHolder(holder: ViewHolder, position: Int) { val data = dataSet[position] holder.textView.text = data.text holder.deleteButton.setOnClickListener { // 获取数据项的唯一标识 val id = data.id // 在数据库中删除该记录 database.delete("table_name", "id=?", arrayOf(id.toString())) // 刷新 RecyclerView dataSet.toMutableList().removeAt(position) notifyItemRemoved(position) notifyItemRangeChanged(position, dataSet.size) } } override fun getItemCount() = dataSet.size } ``` 在这个示例中,我们传入了一个 SQLiteDatabase 对象,它可以在 Adapter 中直接使用,用于执行数据库操作。在 onBindViewHolder 方法中,我们为 deleteButton 设置了 OnClickListener,并在其中获取了数据项的唯一标识 id,并使用该 id 删除了数据库中对应的记录。最后,我们还需要刷新 RecyclerView,以便删除后可以正确显示。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Zender Han

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值