2 years ago

#73750

test-img

Maksimka

How can I tell the adapter ViewPager2 to redraw elements?

My app contains viewpager and tablayout. It requests data from the server, sorts and gives each tab its own set of information. I don't want to have a request to the network every time I select a tab, so I made a host fragment that makes a request to the network and creates tabs. But when the data arrives, the view is already rendered. I give the data through the bundle to the ViewPagerAdapter. The first tab does not update the data. How can I tell the adapter to redraw a particular element?

HostFragment

    private val tabsTitles by lazy(LazyThreadSafetyMode.NONE) {
        listOf("All", "Analytics", "Android",  "Management")
    }
    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        val departmentTabLayout = view.findViewById<TabLayout>(R.id.departmentTabLayout)
        val departmentViewPager = view.findViewById<ViewPager2>(R.id.departmentViewPager)
        val adapter = TabsAdapter(childFragmentManager, lifecycle)

        departmentViewPager.adapter = adapter
        attachTabs(departmentTabLayout, departmentViewPager)

        departmentHostViewModel.listUsers.observe(viewLifecycleOwner, {
            adapter.getUsers(it.items)
            //adapter.notifyDataSetChanged()
        })
    }
    private fun attachTabs(departmentTabLayout: TabLayout, departmentViewPager: ViewPager2) {
        TabLayoutMediator(departmentTabLayout, departmentViewPager) { tab, position ->
            tab.text = tabsTitles[position]
        }.attach()
    }

TabsAdapter

class TabsAdapter(
    fm: FragmentManager,
    lifecycle: Lifecycle,
) : FragmentStateAdapter(fm, lifecycle) {
    private val listDepartments = listOf(
        "all",
        "analytics",
        "android",
        "management"
    )
    private val listUsers: MutableList<User> = mutableListOf()

    override fun createFragment(position: Int): Fragment {
        val departmentFragment = DepartmentFragment()
        return when (position) {
            0 -> {
                departmentFragment.arguments = bundleOf(DepartmentFragment.LIST_USERS to listUsers)
                return departmentFragment
            }
            else -> {
                departmentFragment.arguments =
                    bundleOf(DepartmentFragment.LIST_USERS to listUsers.filter { it.department == listDepartments[position] })
                return departmentFragment
            }
        }
    }
    override fun getItemCount(): Int {
        return listDepartments.count()
    }

    fun getUsers(listUsers2: List<User>) {
        listUsers.addAll(listUsers2)
        notifyDataSetChanged()
    }
}

android

kotlin

android-recyclerview

android-tablayout

android-viewpager2

0 Answers

Your Answer

Accepted video resources