仿Instagram首页滚动播放视频 RecyclerView内嵌ViewPager第二项Fragment未创建问题
问题根因
你代码里的核心错误是嵌套Fragment使用了错误的FragmentManager,加上RecyclerView复用逻辑不合理、ViewPager适配器存在冗余逻辑,共同导致第二项Fragment无法正常创建。
修复步骤
1. 修正FragmentManager的传入逻辑
你在RecyclerView适配器内部直接强转Activity获取supportFragmentManager是错误的:
- 如果Feed列表承载在Activity中,可传入Activity的
supportFragmentManager - 如果Feed列表承载在Fragment中,必须传入宿主Fragment的
childFragmentManager
修改适配器构造,新增FragmentManager传参:
class DashboardFeedsAdapterNew( private val mContext: Context, // 新增参数,由外部传入正确的FragmentManager private val fragmentManager: FragmentManager, var mList: ArrayList<PostListModel.PostListData>, private val viewHolderClicks: ViewHolderClicks, ) : RecyclerView.Adapter<RecyclerView.ViewHolder>()
修改setupViewpager中适配器初始化逻辑,不要内部强转拿Activity的FragmentManager:
binding.vpAttachment.adapter = ViewPagerAdapter(fragmentManager, model)
2. 清理ViewPager适配器的冗余逻辑
你定义的mFragmentList、mFragmentTitleList从未被赋值,getPageTitle取空列表会触发空指针,直接删除冗余代码:
inner class ViewPagerAdapter(fm: FragmentManager, val mData: PostListModel.PostListData) : FragmentStatePagerAdapter(fm, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT ) { override fun getItemPosition(`object`: Any): Int { return POSITION_NONE } override fun getItem(position: Int): Fragment { mData.files[position].position = position return PostMediaPreviewPageFragment.newInstance(position,mData.id, mData.files[position]) } override fun getCount(): Int = mData.files.size override fun getPageTitle(position: Int): CharSequence? { // 不需要标题直接返回null即可 return null } }
3. 优化RecyclerView复用逻辑,避免重复设置ViewPager适配器
每次onBindViewHolder都重置ViewPager适配器会导致Fragment状态混乱,给ViewHolder加绑定标记,仅当数据变更时才重新初始化ViewPager:
首先给PostViewHolder新增绑定标记:
inner class PostViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { // 新增标记,记录当前绑定的帖子ID,根据你的ID类型调整 var boundPostId: Long? = null // 原有字段保持不变... }
修改onBindViewHolder逻辑:
override fun onBindViewHolder( holder: RecyclerView.ViewHolder, position: Int ) { val model = mList[holder.adapterPosition] if (holder is PostViewHolder) { try { if (model.files.isNotEmpty()) { // 仅当帖子ID变更时才重新初始化ViewPager if (holder.boundPostId != model.id) { setupViewpager(holder, model) holder.boundPostId = model.id // 设置预加载数量,避免Fragment频繁销毁重建 holder.vpAttachment.offscreenPageLimit = 1 } } } catch (e: Exception) { e.printStackTrace() } } }
额外优化建议(视频自动播放场景)
后续做横竖滚动自动播放暂停时,建议通过RecyclerView滚动监听计算当前完全可见的帖子Item,再获取该Item内ViewPager的当前选中Fragment来控制播放状态,比依赖Fragment生命周期判断更准确,也能避免多个视频同时播放的问题。
内容的提问来源于stack exchange,提问作者Zala Satyaraj
相关产品推荐
相关产品推荐

