使用RecyclerView时如何修改父布局视图?同一Adapter适配双RecyclerView如何调整特定列表视图
解决方案
针对两个RecyclerView共用Adapter和布局的差异化修改需求,推荐以下两种实现方案:
方案1:新增场景标识参数(改动最小,优先推荐)
通过给Adapter构造函数增加标识参数,区分当前实例对应的RecyclerView场景,在绑定逻辑、布局加载阶段做差异化处理。
- 先定义场景枚举(也可以直接用Boolean标记,枚举扩展性更好)
enum class AdapterScene { SCENE_DEFAULT, SCENE_SPECIAL // 分别对应普通场景和需要修改布局的特殊场景 }
- 修改Adapter构造函数,新增场景参数
class PictureAdapter( private val onclickToRemove: ((Int) -> Unit?)?, private val onclickToZoom: ((String) -> Unit?)?, private val context: Context, // 新增场景参数,默认值设为常用的普通场景 private val scene: AdapterScene = AdapterScene.SCENE_DEFAULT ) : RecyclerView.Adapter<PictureAdapter.MyViewHolder>() {
- 做差异化处理
- 如果只是同布局内的视图样式、显隐修改,直接在
onBind方法里加判断即可:
fun onBind(item: PictureModel) { Glide.with(context).load(item.urlPicture).into(picture) pictureName.text = item.pictureName // 特殊场景差异化处理示例 if (scene == AdapterScene.SCENE_SPECIAL) { btnRemove.visibility = View.GONE // 隐藏删除按钮 picture.cornerRadius = 20f // 修改图片圆角 pictureName.textSize = 14f // 修改文字大小 // 其他自定义修改逻辑 } else { btnRemove.visibility = View.VISIBLE picture.cornerRadius = 8f pictureName.textSize = 16f } btnRemove.setOnClickListener { onclickToRemove?.invoke(adapterPosition) } itemView.setOnClickListener { onclickToZoom?.invoke(item.urlPicture) } }- 如果需要完全更换布局文件,修改
onCreateViewHolder逻辑即可,注意两个布局的控件id要保持一致,避免find空指针:
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MyViewHolder { val layoutId = if (scene == AdapterScene.SCENE_SPECIAL) { R.layout.item_picture_special // 特殊场景自定义布局 } else { R.layout.item_picture } val view = LayoutInflater.from(parent.context).inflate(layoutId,parent,false) return MyViewHolder(view) } - 如果只是同布局内的视图样式、显隐修改,直接在
- 实例化时给不同RecyclerView传对应参数
// 普通RecyclerView用的Adapter实例 val defaultAdapter = PictureAdapter(onRemove, onZoom, context) // 需修改布局的特殊RecyclerView用的Adapter实例 val specialAdapter = PictureAdapter(onRemove, onZoom, context, AdapterScene.SCENE_SPECIAL)
方案2:多ViewType实现
如果两个场景的布局差异大、控件结构不一致,可以用RecyclerView原生的多ViewType机制,更适合后续多场景扩展:
// 重写getItemViewType返回不同类型 override fun getItemViewType(position: Int): Int { return scene.ordinal } // onCreateViewHolder根据viewType加载对应布局 override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MyViewHolder { val layoutId = when(viewType) { AdapterScene.SCENE_SPECIAL.ordinal -> R.layout.item_picture_special else -> R.layout.item_picture } val view = LayoutInflater.from(parent.context).inflate(layoutId,parent,false) return MyViewHolder(view) }
内容的提问来源于stack exchange,提问作者Lộc Trần Phước
相关产品推荐
相关产品推荐

