You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

仿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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 13:57:03