2 years ago
#73750

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