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

嵌套Fragment中TabLayout下的RecyclerView不显示问题求助

RecyclerView在TabLayout子Fragment中无法显示问题

我尝试在作为Fragment的TabLayout的子Fragment中展示RecyclerView,程序无报错但RecyclerView始终无法显示。已知TabLayout的子Fragment可以承载RecyclerView,不确定是否因为TabLayout本身构建在Fragment上导致问题,附上相关代码寻求帮助:

TabLayoutFragment代码

var viewPager = root.findViewById(R.id.viewPager) as ViewPager
var tablayout = root.findViewById(R.id.tabLayout) as TabLayout

val fragmentAdapter = FragmentAdapter(requireActivity().supportFragmentManager)
fragmentAdapter.addFragment(OpenLoansFragment(), "Active")
fragmentAdapter.addFragment(ClosedLoansFragment(), "Closed")

viewPager.adapter = fragmentAdapter
tablayout.setupWithViewPager(viewPager)

子Fragment(OpenLoansFragment)代码

private lateinit var swipeRefreshLayout:SwipeRefreshLayout
private lateinit var loanRecRcv:RecyclerView
private var list: ArrayList<LoanRecordModel> = ArrayList()
private var loanRecRcvAdapter = LoanRecRcvAdapter(list, this)

override fun onCreateView(
    inflater: LayoutInflater, container: ViewGroup?,
    savedInstanceState: Bundle?
): View? {
    _binding = FragmentOpenLoansBinding.inflate(inflater, container, false)
    val root: View = binding.root
    return root
}

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    super.onViewCreated(view, savedInstanceState)

    list = arrayListOf(
        LoanRecordModel("", "Petty Cash Loan", "12/05/2022", "Open"),
        LoanRecordModel("", "Petty Cash Loan", "12/05/2022", "Open"),
        LoanRecordModel("", "Petty Cash Loan", "12/05/2022", "Open"),
        LoanRecordModel("", "Petty Cash Loan", "12/05/2022", "Open"),
        LoanRecordModel("", "Petty Cash Loan", "12/05/2022", "Open")
    )

    initView()

    loanRecRcv.apply{
        layoutManager = LinearLayoutManager(activity)
        adapter = loanRecRcvAdapter
    }
}

private fun initView() {
    swipeRefreshLayout = requireActivity().findViewById(R.id.swipeRefresh)
    loanRecRcv = requireActivity().findViewById(R.id.loanRecRcv)
}

问题排查与解决方案

1. 错误的View获取方式

你在initView()中使用requireActivity().findViewById()获取控件,这会去Activity的布局中查找目标控件,但这些控件实际属于子Fragment的布局,最终获取到的是无效引用(因lateinit未触发崩溃,但后续操作完全无效)。

修正方式:
改用Fragment的View Binding或者通过view.findViewById()获取控件:

// 方式1:用View Binding(推荐)
private fun initView() {
    swipeRefreshLayout = binding.swipeRefresh
    loanRecRcv = binding.loanRecRcv
}

// 方式2:用view.findViewById()
private fun initView() {
    swipeRefreshLayout = view.findViewById(R.id.swipeRefresh)
    loanRecRcv = view.findViewById(R.id.loanRecRcv)
}

2. Adapter数据未正确关联

初始化loanRecRcvAdapter时传入了空列表,之后重新赋值list = arrayListOf(...),但Adapter持有的还是原来的空列表引用,新数据并未与Adapter建立关联。

修正方式:

  • 方式一:复用原列表,更新后通知Adapter:
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    super.onViewCreated(view, savedInstanceState)

    list.clear()
    list.addAll(
        listOf(
            LoanRecordModel("", "Petty Cash Loan", "12/05/2022", "Open"),
            LoanRecordModel("", "Petty Cash Loan", "12/05/2022", "Open"),
            // ... 其他数据
        )
    )

    initView()

    loanRecRcv.apply{
        layoutManager = LinearLayoutManager(activity)
        adapter = loanRecRcvAdapter
    }
    loanRecRcvAdapter.notifyDataSetChanged() // 通知Adapter更新数据
}
  • 方式二:获取数据后再初始化Adapter:
// 移除全局的adapter初始化,改为按需创建
private var loanRecRcvAdapter: LoanRecRcvAdapter? = null

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    super.onViewCreated(view, savedInstanceState)

    list = arrayListOf(
        // ... 数据
    )

    initView()

    loanRecRcvAdapter = LoanRecRcvAdapter(list, this)
    loanRecRcv.apply{
        layoutManager = LinearLayoutManager(activity)
        adapter = loanRecRcvAdapter
    }
}

额外检查点

  • 确认子Fragment布局文件中存在ID为loanRecRcv的RecyclerView,且布局参数设置合理(避免因wrap_content导致无内容时完全不显示,父布局约束需正确)。
  • 确认LoanRecRcvAdapter的onCreateViewHolder和onBindViewHolder逻辑正常,能正确加载Item布局。

内容的提问来源于stack exchange,提问作者Nigel Manimtim

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 17:30:33