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

点击RecyclerView项添加文本到String ArrayList的元素覆盖问题解决

问题核心原因

每个HobbiesAdapter实例都自带独立的ArrayList,RecyclerView的每个条目对应一个adapter对象。点击不同条目时,操作的是各自adapter内部的list,而非同一个共享集合,所以每次点击只会保留当前条目的元素,之前的元素属于另一个adapter的list,自然无法累积显示。

解决方法

把共享的ArrayList移到Activity/Fragment这类宿主组件中,通过回调机制让adapter点击时通知外部添加元素,确保所有条目操作的是同一个集合。


第一步:定义点击回调接口

interface OnHobbyClickListener {
    fun onHobbySelected(hobbyName: String)
}

第二步:修改Adapter,移除内部list,注入回调

class HobbiesAdapter(
    val hobbyItem: HobbiesClass,
    private val clickListener: OnHobbyClickListener
) : Item<GroupieViewHolder>() {

    override fun bind(viewHolder: GroupieViewHolder, position: Int) {
        viewHolder.itemView.hobbynameTV.text = hobbyItem.hobbyName
        Picasso.get().load(hobbyItem.imageUrl).into(viewHolder.itemView.hobbyImageView)

        viewHolder.itemView.setOnClickListener {
            val hobbyName = viewHolder.itemView.hobbynameTV.text.toString()
            // 通知外部宿主添加元素
            clickListener.onHobbySelected(hobbyName)
        }
    }

    override fun getLayout(): Int {
        return R.layout.row
    }
}

第三步:在宿主组件中维护共享list并实现回调

以Activity为例:

class HobbyHostActivity : AppCompatActivity(), OnHobbyClickListener {
    // 全局共享的选中爱好集合
    private val selectedHobbies = ArrayList<String>()

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_hobby_host)

        // 初始化GroupAdapter并添加条目
        val groupAdapter = GroupAdapter<GroupieViewHolder>()
        // 假设hobbiesDataSource是你的爱好数据源列表
        hobbiesDataSource.forEach { hobby ->
            groupAdapter.add(HobbiesAdapter(hobby, this))
        }
        // 把groupAdapter设置给RecyclerView
        yourRecyclerView.adapter = groupAdapter
    }

    override fun onHobbySelected(hobbyName: String) {
        selectedHobbies.add(hobbyName)
        Log.d("list ", selectedHobbies.toString())
    }
}

可选优化:避免重复添加

如果需要防止同一个爱好被多次选中,可以在回调方法里加判断:

override fun onHobbySelected(hobbyName: String) {
    if (!selectedHobbies.contains(hobbyName)) {
        selectedHobbies.add(hobbyName)
        Log.d("list ", selectedHobbies.toString())
    }
}

内容的提问来源于stack exchange,提问作者Eren Ahmed

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 05:20:22