如何在ChildRecyclerAdapter中获取ParentRecyclerAdapter的DayOfWeek数据?
解决方案:在子适配器中获取父适配器的DayOfWeek数据
要实现这个需求,核心思路是在父适配器绑定子RecyclerView时,把当前Item对应的DayOfWeek值直接传递给子适配器,这样子适配器就能在自己的onBindViewHolder里直接使用这个值做逻辑判断了。下面是具体的实现步骤和修改后的代码:
1. 修改ChildRecyclerAdapter的构造函数
首先给子适配器添加一个专门接收当前DayOfWeek的参数,替换掉原来冗余的parentArrayList(我们只需要当前父Item的DayOfWeek,不需要整个列表):
class ChildRecyclerAdapter( private var time: ArrayList<String>, var context: Context, private val currentDayOfWeek: String // 新增:接收当前父Item的DayOfWeek ) : RecyclerView.Adapter<ChildRecyclerAdapter.ChildViewHolder>() { override fun onBindViewHolder(holder: ChildViewHolder, position: Int) { holder.timeOfDay.text = time[position] mTableFeed = TableFeedJava(context, mLectures) holder.childofChildRV.adapter = mTableFeed // 这里就可以直接使用currentDayOfWeek做逻辑判断了 for (i in mTimeSpinner!!.indices) { // 结合DayOfWeek和时间条件做判断 if (holder.timeOfDay.text == mTimeSpinner!![i] && currentDayOfWeek == "目标星期值") { holder.childofChildRV.visibility = View.VISIBLE } else { holder.childofChildRV.visibility = View.INVISIBLE } } } // 其他原有代码保持不变 inner class ChildViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { internal var timeOfDay: TextView = itemView.findViewById(R.id.timeOfDay) internal var childofChildRV: RecyclerView = itemView.findViewById(R.id.childofChildRecycler) } }
2. 在ParentRecyclerAdapter中传递DayOfWeek
在父适配器的onBindViewHolder里,初始化子适配器时把当前position对应的DayOfWeek传递进去,同时别忘了给子RecyclerView设置布局管理器:
class ParentRecyclerAdapter( private var parentArrayList: ArrayList<String>?, private var context: Context, private var mTableFeed: TableFeedJava? ) : RecyclerView.Adapter<ParentRecyclerAdapter.ParentViewHolder>() { override fun onBindViewHolder(holder: ParentViewHolder, position: Int) { val currentDay = parentArrayList!![position] holder.DayOfWeek.text = currentDay // 初始化子适配器,传入当前的DayOfWeek val childAdapter = ChildRecyclerAdapter( time = /* 传入你的time列表数据源 */, context = context, currentDayOfWeek = currentDay ) // 给子RecyclerView设置布局管理器(示例用LinearLayoutManager) holder.ChildRV.layoutManager = LinearLayoutManager(context) holder.ChildRV.adapter = childAdapter } override fun getItemCount(): Int { return parentArrayList!!.size } inner class ParentViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { internal var DayOfWeek: TextView = itemView.findViewById(R.id.dayOfWeek) internal var ChildRV: RecyclerView = itemView.findViewById(R.id.ChildRecycler) } }
关键说明
- 我们只传递当前父Item对应的
currentDayOfWeek,而非整个父列表,这样更高效,也避免了子适配器不必要的列表持有。 - 如果需要根据不同星期做差异化逻辑,直接在子适配器的
onBindViewHolder里对currentDayOfWeek做判断即可,比如判断是否为周一/周末等。
内容的提问来源于stack exchange,提问作者Orwa Ogwari
相关产品推荐
相关产品推荐

