LiveData is not updating the list in TabFragment when viewcreated

29 Views Asked by At

I am just stuck here and tried a lot many things but didn't get the solution so the problem is

I am having a Tab host and inside it two tab items and used viewpager2 for displaying the contents from the api using the live data

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()
                }
            }
    }
}

Problem: so when the parent fragment is created the data is not displayed and also i am getting the list as 0 but soon as I click on the Task again or move from task to reward tab and then to task tab the data list is fetched from the api and the contents are displayed

enter image description here

here is the code for the 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)
    }

}

below is the code where i am using the tablayout

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()
            }

        })


        //for Swiping the tab
        binding.viewPager.registerOnPageChangeCallback(object : ViewPager2.OnPageChangeCallback(){
            override fun onPageSelected(position: Int) {
                binding.tabLayoutTaskReward.selectTab(binding.tabLayoutTaskReward.getTabAt(position))
                taskRewardTabLayoutAdapter.notifyDataSetChanged()
            }
        })
    }

// FragmentstateAdapter for setting the fragments

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()
        }
    }
}
Can anyone help me out this
1

There are 1 best solutions below

0
Jadu On

I cannot find a solution but found a Makeshifter (Jugaad)

override fun onResume() {
        super.onResume()
        val delayMillis = 500L // 0.5 seconds

        Handler().postDelayed({
            binding.tabLayoutTaskReward.getTabAt(0)?.select()
        }, delayMillis)
    }