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

