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

Android Kotlin中RecyclerView点击categoryPhoto跳转新Activity实现方案

在Kotlin的RecyclerView适配器中实现点击图片跳转Activity的方案

嘿,这事儿其实不难,我给你两种实现思路,你可以根据自己的需求选:

方案一:直接在适配器中添加点击监听(快速上手)

你只需要在onBindViewHolder方法里给categoryPhoto设置点击事件,直接创建Intent启动目标Activity就行。修改后的代码如下:

override fun onBindViewHolder(holder: MyViewHolder, position: Int) {
    val category = categoryList[position]
    // Set height of cardview based on screen width
    val displayMetrics = context.resources.displayMetrics
    val finalHeight = displayMetrics.widthPixels / 2
    holder.cardView.layoutParams.height = finalHeight
    holder.categoryName.text = category.oc
    holder.categoryPhoto.loadUrl(category.icon)

    // 给图片添加点击事件
    holder.categoryPhoto.setOnClickListener {
        // 创建跳转Intent,替换成你的目标Activity类
        val intent = Intent(context, CategoryDetailActivity::class.java)
        // 按需传递分类数据,比如分类ID、名称
        intent.putExtra("CATEGORY_NAME", category.oc)
        intent.putExtra("CATEGORY_ICON_URL", category.icon)
        // 启动Activity
        context.startActivity(intent)
    }
}

注意点:

  • 确保你传入适配器的context是Activity的Context,如果用Application Context启动Activity,需要额外添加intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK),否则会抛出异常。
  • 在目标Activity里,你可以通过intent.getStringExtra("CATEGORY_NAME")这类方法获取传递的数据。

方案二:用接口回调解耦(更推荐,避免内存泄漏)

把点击逻辑放在适配器里其实有点违背单一职责原则,而且适配器长期持有Context还可能引发内存泄漏。更规范的做法是定义一个回调接口,让宿主(Activity/Fragment)来处理跳转逻辑:

步骤1:在适配器中定义点击回调接口

class CategoryAdapter(
    private val categoryList: List<Category>,
    // 把原来的context换成回调接口,或者保留context(如果其他地方需要的话)
    private val onPhotoClickListener: OnCategoryPhotoClickListener
) : RecyclerView.Adapter<CategoryAdapter.MyViewHolder>() {

    // 定义回调接口
    interface OnCategoryPhotoClickListener {
        fun onCategoryPhotoClicked(category: Category)
    }

    // ... MyViewHolder类和其他原有代码不变

    override fun onBindViewHolder(holder: MyViewHolder, position: Int) {
        val category = categoryList[position]
        // ... 原有布局赋值代码不变

        // 点击时触发回调
        holder.categoryPhoto.setOnClickListener {
            onPhotoClickListener.onCategoryPhotoClicked(category)
        }
    }
}

步骤2:在Activity/Fragment中实现回调并处理跳转

// 假设这是你的Activity代码
class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val categoryList = // 你的分类数据列表
        val recyclerView = findViewById<RecyclerView>(R.id.recycler_view)
        
        // 创建适配器时实现回调接口
        val adapter = CategoryAdapter(categoryList, object : CategoryAdapter.OnCategoryPhotoClickListener {
            override fun onCategoryPhotoClicked(category: Category) {
                // 在这里处理跳转逻辑
                val intent = Intent(this@MainActivity, CategoryDetailActivity::class.java)
                // 如果Category实现了Parcelable/Serializable,可以直接传递整个对象
                intent.putExtra("SELECTED_CATEGORY", category)
                startActivity(intent)
            }
        })

        recyclerView.adapter = adapter
        // 设置LayoutManager等其他配置
    }
}

补充:让Category支持对象传递

如果要直接传递Category对象,需要让它实现Parcelable(推荐,性能更好)或者Serializable接口:

// 示例:让Category实现Parcelable
data class Category(
    val oc: String,
    val icon: String,
    // 其他字段
) : Parcelable {
    constructor(parcel: Parcel) : this(
        parcel.readString() ?: "",
        parcel.readString() ?: ""
    )

    override fun writeToParcel(parcel: Parcel, flags: Int) {
        parcel.writeString(oc)
        parcel.writeString(icon)
    }

    override fun describeContents(): Int {
        return 0
    }

    companion object CREATOR : Parcelable.Creator<Category> {
        override fun createFromParcel(parcel: Parcel): Category {
            return Category(parcel)
        }

        override fun newArray(size: Int): Array<Category?> {
            return arrayOfNulls(size)
        }
    }
}

这样在目标Activity里就能通过intent.getParcelableExtra<Category>("SELECTED_CATEGORY")获取到完整的分类对象了。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:34:32