点击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
相关产品推荐
相关产品推荐

