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

Kotlin ListView两类Intent跳转遇覆盖及点击崩溃问题求助

问题描述

我加载数据生成列表,需要实现两种Intent跳转逻辑:

  • 点击列表项中的「Activities」文本时,启动跳转至ProfileScreen的Intent
  • 点击列表项其他区域时,启动跳转至DescriptionActivity的Intent

目前遇到两个问题:

  1. 调用startActivity(e)会覆盖startActivity(i)的执行
  2. 为Activities文本添加OnClickListener时应用崩溃

相关代码如下:

Adapter代码

class MyAdapter(private val context : Activity, private val arrayList : ArrayList<Person>) : ArrayAdapter<Person>(context,
    R.layout.list_item, arrayList)      {

    override fun getView(position: Int, convertView: View?, parent: ViewGroup): View {
        val inflater : LayoutInflater = LayoutInflater.from(context)
        val view : View = inflater.inflate(R.layout.list_item, null)

        val imageView : ImageView = view.findViewById(R.id.profile_pic)
        val activities : TextView = view.findViewById(R.id.activity_name)
        val person_name : TextView = view.findViewById(R.id.name_list)
        val activity_time : TextView = view.findViewById(R.id.time)
        val checkbox : ImageView = view.findViewById(R.id.checkbox)
        val person_icon : ImageView = view.findViewById(R.id.person_icon)

        imageView.setImageResource(arrayList[position].imageID)
        activities.text = arrayList[position].activities
        person_name.text = arrayList[position].name
        activity_time.text = arrayList[position].activityTime
        checkbox.setImageResource(arrayList[position].checkbox)
        person_icon.setImageResource(arrayList[position].person_icon)

        return view
    }
}

Activity代码

binding.listview.adapter = MyAdapter(this, personArrayList)
binding.listview.isClickable = true
binding.listview.setOnItemClickListener { parent, view, position, id ->
    val name = name[position]
    val activities = activities[position]
    val activityTime = activityTime[position]
    val description = description[position]
    val imageID = imageID[position]
    val i = Intent(this, DescriptionActivity::class.java)
    val e = Intent(this, ProfileScreen::class.java)
    i.putExtra("name", name)
    i.putExtra("activityTime", activityTime)
    e.putExtra("activities", activities)
    i.putExtra("imageID", imageID)
    i.putExtra("description", description)
    startActivity(i)
}

解决方案

修复「添加OnClickListener崩溃」问题

崩溃原因多是未正确在Adapter中绑定点击事件,或直接持有Activity引用导致生命周期冲突。修改Adapter,给activities TextView绑定点击事件,同时改用Context替代Activity引用:

class MyAdapter(private val context: Context, private val arrayList: ArrayList<Person>) : ArrayAdapter<Person>(context,
    R.layout.list_item, arrayList) {

    override fun getView(position: Int, convertView: View?, parent: ViewGroup): View {
        // 复用视图优化性能,避免重复创建
        val view = convertView ?: LayoutInflater.from(context).inflate(R.layout.list_item, parent, false)

        val imageView: ImageView = view.findViewById(R.id.profile_pic)
        val activities: TextView = view.findViewById(R.id.activity_name)
        val person_name: TextView = view.findViewById(R.id.name_list)
        val activity_time: TextView = view.findViewById(R.id.time)
        val checkbox: ImageView = view.findViewById(R.id.checkbox)
        val person_icon: ImageView = view.findViewById(R.id.person_icon)

        val person = arrayList[position]
        imageView.setImageResource(person.imageID)
        activities.text = person.activities
        person_name.text = person.name
        activity_time.text = person.activityTime
        checkbox.setImageResource(person.checkbox)
        person_icon.setImageResource(person.person_icon)

        // 给Activities文本设置跳转ProfileScreen的点击事件
        activities.setOnClickListener {
            val intent = Intent(context, ProfileScreen::class.java)
            intent.putExtra("activities", person.activities)
            context.startActivity(intent)
        }

        return view
    }
}

修复「跳转逻辑覆盖」问题

原代码中ListView的setOnItemClickListener会和TextView的点击事件冲突,导致跳转逻辑混乱。解决方式是移除ListView的全局点击事件,改为给列表项根布局绑定跳转DescriptionActivity的逻辑:

1. 修改Adapter,给根布局添加点击事件

先给你的list_item.xml根布局设置id(比如root_layout),然后在Adapter中添加点击事件:

// 在getView方法中,添加根布局点击事件逻辑
val rootLayout: View = view.findViewById(R.id.root_layout)
rootLayout.setOnClickListener {
    val intent = Intent(context, DescriptionActivity::class.java)
    val person = arrayList[position]
    intent.putExtra("name", person.name)
    intent.putExtra("activityTime", person.activityTime)
    intent.putExtra("imageID", person.imageID)
    intent.putExtra("description", person.description)
    context.startActivity(intent)
}

2. 简化Activity代码

移除ListView的setOnItemClickListener,仅保留适配器设置:

binding.listview.adapter = MyAdapter(this, personArrayList)

额外注意事项

  • 确保Person类包含所有需要传递的字段(比如description)
  • 根布局需在xml中设置clickable="true",否则点击事件不生效
  • 用Context替代直接持有Activity引用,避免内存泄漏

内容的提问来源于stack exchange,提问作者Kacper Walczak

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 14:01:37