嵌套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
相关产品推荐
相关产品推荐

