两个RecyclerView共用同一Adapter时如何在onBind中识别所属实例
实现方案
不要在ViewHolder中做复杂的反向归属判断,优先用低耦合的实现方式:
方案1:构造Adapter时传入样式参数(推荐)
不要给两个RecyclerView复用同一个Adapter实例,分别初始化Adapter时传入对应需要的文字颜色即可,逻辑最清晰无额外判断开销。
- 首先修改Adapter构造,增加颜色入参:
class CommonAdapter( private val itemTextColor: Int, private val data: List<String> ) : RecyclerView.Adapter<CommonAdapter.ItemViewHolder>() { inner class ItemViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { val contentTv: TextView = itemView.findViewById(R.id.item_tv) } override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { holder.contentTv.text = data[position] // 直接使用构造传入的颜色设置,无需判断当前item归属 holder.contentTv.setTextColor(itemTextColor) } override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { val view = LayoutInflater.from(parent.context) .inflate(R.layout.common_item_layout, parent, false) return ItemViewHolder(view) } override fun getItemCount(): Int = data.size }
- 给两个RecyclerView分别绑定对应配置的Adapter实例:
// recyclerOne绑定传黑色 recyclerOne.adapter = CommonAdapter( itemTextColor = Color.BLACK, data = yourDataList ) // recyclerTwo绑定传蓝色 recyclerTwo.adapter = CommonAdapter( itemTextColor = Color.BLUE, data = yourDataList )
方案2:强制共用单Adapter实例时,通过父容器ID判断
如果业务场景必须让两个RecyclerView共用同一个Adapter对象,可以在onBindViewHolder中通过itemView的父容器溯源,匹配RecyclerView的ID做区分:
override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { holder.contentTv.text = data[position] // 向上遍历找到当前item所属的RecyclerView var parentView = holder.itemView.parent while (parentView != null && parentView !is RecyclerView) { parentView = parentView.parent } // 根据RecyclerView的ID设置对应颜色 when ((parentView as? RecyclerView)?.id) { R.id.recyclerOne -> holder.contentTv.setTextColor(Color.BLACK) R.id.recyclerTwo -> holder.contentTv.setTextColor(Color.BLUE) } }
注意:使用该方案必须给两个RecyclerView在XML布局中设置唯一的ID,否则判断会失效。同时向上遍历View树存在额外性能开销,非必要不优先使用该方案。
内容的提问来源于stack exchange,提问作者Bob Redity
相关产品推荐
相关产品推荐

