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

ViewCreated后LiveData无法更新TabFragment列表,切换Tab后恢复正常求助

ViewPager2 + FragmentStateAdapter 首次加载数据不显示,切换Tab后恢复正常

我通过TabLayout搭配ViewPager2实现了两个Tab页面(TaskTabFragment和RewardTabFragment),在Tab页中使用LiveData从API获取数据并展示到RecyclerView里。目前遇到的问题是:

  • 父Fragment初始化完成后,首次进入Task Tab时,数据无法展示,RecyclerView列表长度为0
  • 但再次点击Task Tab,或者切换到Reward Tab再切回Task Tab时,数据就能正常从API获取并展示

相关代码

TaskTabFragment中观察LiveData的代码

private fun getAdslot() {
    rewardViewModel.aye.observe(viewLifecycleOwner){networkResult->
        if(networkResult.status == "success"){
            if(networkResult.offers.isEmpty()){
                Toast.makeText(requireContext(), "No Task Available", Toast.LENGTH_SHORT).show()
            }else{
                adapter.taskGAmeList = networkResult
                recyclerView.adapter = adapter
                Log.d("TaskTabFragment", "getAdslot: $networkResult")
                adapter.notifyDataSetChanged()
            }
        }
}

RecyclerView Adapter代码

class TabItemTaskAdapter(): RecyclerView.Adapter<TabItemTaskAdapter.TaskViewHolder>() {

    var taskGAmeList:AyetAdSlot?=null


    inner class TaskViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
//        val gameImage: ImageView = itemView.findViewById(R.id.iv_game)
        val gameName: TextView = itemView.findViewById(R.id.tv_game_name)
        val gameSubtitle:TextView = itemView.findViewById(R.id.tv_game_subtitle)
        val rewardPrize:TextView = itemView.findViewById(R.id.tv_reward_amount)
        val ivGameIcon: AppCompatImageView = itemView.findViewById(R.id.iv_game_icon)
    }

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): TaskViewHolder {
        val view = LayoutInflater.from(parent.context).inflate(R.layout.item_task_reward_layout,parent,false)
        return TaskViewHolder(view)
    }

    override fun getItemCount(): Int {
        Log.d("TabItemTaskAdapter", "getItemCount: ${taskGAmeList!!.offers.size}")
        return taskGAmeList!!.offers.size
    }

    override fun onBindViewHolder(holder: TaskViewHolder, position: Int) {
        Log.d("RewardTabFragment", "onBindViewHolder: ${taskGAmeList!!.offers.size}")
        val currentItem = taskGAmeList!!.offers[position]
        holder.gameName.text = currentItem.name
        holder.gameSubtitle.text = currentItem.description
        holder.rewardPrize.text = currentItem.currency_amount.toString()
        Glide.with(holder.itemView.context).load(currentItem?.icon).override(96).
        into(holder.ivGameIcon)
    }

}

父Fragment中TabLayout与ViewPager2配置代码

private fun setUpTaskRewardTabLayout(){
    binding.tabLayoutTaskReward.setTabTextColors(ContextCompat.getColor(requireContext(), R.color.light_grey),ContextCompat.getColor(requireContext(),R.color.primary_text_color))
    taskRewardTabLayoutAdapter = TaskRewardTabLayoutAdapter(childFragmentManager,lifecycle)
    binding.viewPager.adapter = taskRewardTabLayoutAdapter

    Log.d("RewardTabFragment", "setUpTaskRewardTabLayout: ${binding.tabLayoutTaskReward.selectedTabPosition} ")
    binding.tabLayoutTaskReward.addOnTabSelectedListener(object : TabLayout.OnTabSelectedListener{
        override fun onTabSelected(tab: TabLayout.Tab?) {
            Log.d("RewardTabFragment", "onTabSelected: ${tab!!.position} ")
            binding.viewPager.currentItem = tab.position

            taskRewardTabLayoutAdapter.notifyDataSetChanged()
        }

        override fun onTabUnselected(tab: TabLayout.Tab?) {
            taskRewardTabLayoutAdapter.notifyDataSetChanged()
        }

        override fun onTabReselected(tab: TabLayout.Tab?) {
            taskRewardTabLayoutAdapter.notifyDataSetChanged()
        }

    })


    // 处理滑动切换Tab
    binding.viewPager.registerOnPageChangeCallback(object : ViewPager2.OnPageChangeCallback(){
        override fun onPageSelected(position: Int) {
            binding.tabLayoutTaskReward.selectTab(binding.tabLayoutTaskReward.getTabAt(position))
            taskRewardTabLayoutAdapter.notifyDataSetChanged()
        }
    })
}

FragmentStateAdapter代码

class TaskRewardTabLayoutAdapter(fragmentManager: FragmentManager, lifecycle: Lifecycle) :
    FragmentStateAdapter(fragmentManager, lifecycle) {

    override fun getItemCount(): Int {
        return 2
    }

    override fun createFragment(position: Int): Fragment {
        return if(position==0){
            TaskTabFragment()
        } else{
            RewardTabFragment()
        }
    }
}

恳请各位帮忙排查并解决这个问题!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 01:55:58