Skip to content

Commit 25505d4

Browse files
authored
refactor(database): migrate to viewpager2 (#1315)
1 parent 165ef07 commit 25505d4

File tree

3 files changed

+29
-30
lines changed

3 files changed

+29
-30
lines changed

database/app/src/main/java/com/google/firebase/quickstart/database/java/MainFragment.java

+15-16
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,10 @@
1111
import androidx.annotation.NonNull;
1212
import androidx.annotation.Nullable;
1313
import androidx.fragment.app.Fragment;
14-
import androidx.fragment.app.FragmentPagerAdapter;
1514
import androidx.navigation.fragment.NavHostFragment;
15+
import androidx.viewpager2.adapter.FragmentStateAdapter;
1616

17+
import com.google.android.material.tabs.TabLayoutMediator;
1718
import com.google.firebase.auth.FirebaseAuth;
1819
import com.google.firebase.quickstart.database.R;
1920
import com.google.firebase.quickstart.database.databinding.FragmentMainBinding;
@@ -38,37 +39,35 @@ public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceStat
3839
setHasOptionsMenu(true);
3940

4041
// Create the adapter that will return a fragment for each section
41-
FragmentPagerAdapter mPagerAdapter = new FragmentPagerAdapter(getParentFragmentManager(),
42-
FragmentPagerAdapter.BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT) {
42+
FragmentStateAdapter mPagerAdapter = new FragmentStateAdapter(getParentFragmentManager(),
43+
getViewLifecycleOwner().getLifecycle()) {
4344
private final Fragment[] mFragments = new Fragment[]{
4445
new RecentPostsFragment(),
4546
new MyPostsFragment(),
4647
new MyTopPostsFragment(),
4748
};
48-
private final String[] mFragmentNames = new String[]{
49-
getString(R.string.heading_recent),
50-
getString(R.string.heading_my_posts),
51-
getString(R.string.heading_my_top_posts)
52-
};
5349

50+
@NonNull
5451
@Override
55-
public Fragment getItem(int position) {
52+
public Fragment createFragment(int position) {
5653
return mFragments[position];
5754
}
5855

5956
@Override
60-
public int getCount() {
57+
public int getItemCount() {
6158
return mFragments.length;
6259
}
63-
64-
@Override
65-
public CharSequence getPageTitle(int position) {
66-
return mFragmentNames[position];
67-
}
6860
};
6961
// Set up the ViewPager with the sections adapter.
7062
binding.container.setAdapter(mPagerAdapter);
71-
binding.tabs.setupWithViewPager(binding.container);
63+
String[] mFragmentNames = new String[]{
64+
getString(R.string.heading_recent),
65+
getString(R.string.heading_my_posts),
66+
getString(R.string.heading_my_top_posts)
67+
};
68+
new TabLayoutMediator(binding.tabs, binding.container,
69+
(tab, position) -> tab.setText(mFragmentNames[position])
70+
).attach();
7271
}
7372

7473
@Override

database/app/src/main/java/com/google/firebase/quickstart/database/kotlin/MainFragment.kt

+13-13
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,9 @@ import android.view.MenuItem
88
import android.view.View
99
import android.view.ViewGroup
1010
import androidx.fragment.app.Fragment
11-
import androidx.fragment.app.FragmentPagerAdapter
1211
import androidx.navigation.fragment.findNavController
12+
import androidx.viewpager2.adapter.FragmentStateAdapter
13+
import com.google.android.material.tabs.TabLayoutMediator
1314
import com.google.firebase.auth.ktx.auth
1415
import com.google.firebase.ktx.Firebase
1516
import com.google.firebase.quickstart.database.R
@@ -22,7 +23,7 @@ class MainFragment : Fragment() {
2223
private var _binding: FragmentMainBinding? = null
2324
private val binding get() = _binding!!
2425

25-
private lateinit var pagerAdapter: FragmentPagerAdapter
26+
private lateinit var pagerAdapter: FragmentStateAdapter
2627

2728
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
2829
_binding = FragmentMainBinding.inflate(inflater, container, false)
@@ -34,28 +35,27 @@ class MainFragment : Fragment() {
3435
setHasOptionsMenu(true)
3536

3637
// Create the adapter that will return a fragment for each section
37-
pagerAdapter = object : FragmentPagerAdapter(parentFragmentManager, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT) {
38+
pagerAdapter = object : FragmentStateAdapter(parentFragmentManager, viewLifecycleOwner.lifecycle) {
3839
private val fragments = arrayOf<Fragment>(
3940
RecentPostsFragment(),
4041
MyPostsFragment(),
4142
MyTopPostsFragment())
4243

43-
private val fragmentNames = arrayOf(
44-
getString(R.string.heading_recent),
45-
getString(R.string.heading_my_posts),
46-
getString(R.string.heading_my_top_posts))
44+
override fun createFragment(position: Int) = fragments[position]
4745

48-
override fun getItem(position: Int) = fragments[position]
49-
50-
override fun getCount() = fragments.size
51-
52-
override fun getPageTitle(position: Int) = fragmentNames[position]
46+
override fun getItemCount() = fragments.size
5347
}
5448

5549
// Set up the ViewPager with the sections adapter.
5650
with(binding) {
5751
container.adapter = pagerAdapter
58-
tabs.setupWithViewPager(container)
52+
TabLayoutMediator(tabs, container) { tab, position ->
53+
tab.text = when(position) {
54+
0 -> getString(R.string.heading_recent)
55+
1 -> getString(R.string.heading_my_posts)
56+
else -> getString(R.string.heading_my_top_posts)
57+
}
58+
}.attach()
5959
}
6060
}
6161

database/app/src/main/res/layout/fragment_main.xml

+1-1
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
app:layout_constraintTop_toTopOf="parent"
1313
/>
1414

15-
<androidx.viewpager.widget.ViewPager
15+
<androidx.viewpager2.widget.ViewPager2
1616
android:id="@+id/container"
1717
android:layout_width="match_parent"
1818
android:layout_height="0dp"

0 commit comments

Comments
 (0)