Kotlin ListView两类Intent跳转遇覆盖及点击崩溃问题求助
问题描述
我加载数据生成列表,需要实现两种Intent跳转逻辑:
- 点击列表项中的「Activities」文本时,启动跳转至
ProfileScreen的Intent - 点击列表项其他区域时,启动跳转至
DescriptionActivity的Intent
目前遇到两个问题:
- 调用
startActivity(e)会覆盖startActivity(i)的执行 - 为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
相关产品推荐
相关产品推荐

